我有一个表,其中保存了每个用户的打卡/打卡记录:
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计算出每个月的总工作时间吗?
干杯
发布于 2011-03-03 19:32:28
无论在Linq还是在SQL中,这都不是一件容易的事情。没有一种简单的方法可以将每个OUT记录与SQL中相应的IN记录链接起来。
您有两个选择:
在循环中使用代码查询数据和计算的
选项1很容易实现,但我会认真考虑选项2。如何在业务规则中定义每个IN记录后面必须跟一个相应的OUT记录(或者是最后一条记录)?
发布于 2011-03-03 20:04:16
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方法不是最好的,但即使在最后一个事件没有输出时间戳的情况下也是有效的,即当最后一个会话仍然没有关闭时。
发布于 2011-03-03 19:26:27
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),它就会中断。
https://stackoverflow.com/questions/5180044
复制相似问题