首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在LINQ中计算总工作时间?

如何在LINQ中计算总工作时间?
EN

Stack Overflow用户
提问于 2011-03-03 19:20:24
回答 4查看 847关注 0票数 0

我有一个表,其中保存了每个用户的打卡/打卡记录:

代码语言:javascript
复制
RecID   User    In/Out  ClockInOutTime
8      1       IN      25/02/2011 09:36:44
9      1       OUT     25/02/2011 11:36:44
10    1       IN      25/02/2011 12:36:44
11    1       OUT     25/02/2011 17:36:44
12    1       IN      26/02/2011 00:00:00
13    1       OUT     26/02/2011 12:00:00
14    1       IN      26/02/2011 09:00:44
15    1       OUT     26/02/2011 12:36:44

你知道如何使用LINQ计算出每个月的总工作时间吗?

干杯

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-03 19:32:28

无论在Linq还是在SQL中,这都不是一件容易的事情。没有一种简单的方法可以将每个OUT记录与SQL中相应的IN记录链接起来。

您有两个选择:

在循环中使用代码查询数据和计算的

  1. 更改表架构,如下所示:

选项1很容易实现,但我会认真考虑选项2。如何在业务规则中定义每个IN记录后面必须跟一个相应的OUT记录(或者是最后一条记录)?

票数 1
EN

Stack Overflow用户

发布于 2011-03-03 20:04:16

代码语言:javascript
复制
  SELECT (SELECT SUM(DATEDIFF(SECOND,[ClockInOutTime], GETDATE()))
     FROM [swp].[dbo].[Table_1] t1
     WHERE [In/Out] = 'IN'
     AND t1.[User] = t.[User]) -
     Coalesce((SELECT SUM(DATEDIFF(SECOND,[ClockInOutTime], GETDATE()))
     FROM [swp].[dbo].[Table_1] t2
     WHERE [In/Out] = 'OUT'
     AND t2.[User] = t.[User]),0)
  FROM [swp].[dbo].[Table_1] t   
  GROUP BY [User]

解决这个问题的SQL方法不是最好的,但即使在最后一个事件没有输出时间戳的情况下也是有效的,即当最后一个会话仍然没有关闭时。

票数 2
EN

Stack Overflow用户

发布于 2011-03-03 19:26:27

代码语言:javascript
复制
TimeSpan output = new TimeSpan(0,0,0);
using (var enumerator = input.GetEnumerator())
{
    while (enumerator.MoveNext())
    {
      var begin = enumerator.Current.ClockInOutTime;
      if(!enumerator.MoveNext())
        break;

      var end = enumerator.Current.ClockInOutTime;
      output += (end - begin);
    }
}

是的,它不是LINQ,但我想提供一个解决方案--第二,如果日期不是交替的(所以在IN之后总是一个OUT),它就会中断。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5180044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档