【发布时间】:2014-03-26 20:26:39
【问题描述】:
我有一个简单的表格,用于存储员工全天的打卡和打卡:
╔══════════╦══════════════════╦════════════╗
║ Employee ║ PunchDateTime ║ ActionType ║
╠══════════╬══════════════════╬════════════╣
║ John ║ 2014/03/26 08:00 ║ IN ║
║ Mark ║ 2014/03/26 08:12 ║ IN ║
║ John ║ 2014/03/26 08:50 ║ OUT ║
║ John ║ 2014/03/26 09:29 ║ IN ║
║ Mark ║ 2014/03/26 10:35 ║ OUT ║
║ John ║ 2014/03/26 10:55 ║ OUT ║
║ Mark ║ 2014/03/26 11:42 ║ IN ║
║ John ║ 2014/03/26 12:38 ║ IN ║
║ John ║ 2014/03/26 16:21 ║ OUT ║
║ Mark ║ 2014/03/26 16:49 ║ OUT ║
╚══════════╩══════════════════╩════════════╝
我想构建一个计算进出时间的查询。最终结果应如下所示:
╔══════════╦══════════════════╦════════════╦════════╦═════════╗
║ Employee ║ PunchDateTime ║ ActionType ║ TimeIn ║ TimeOut ║
╠══════════╬══════════════════╬════════════╬════════╬═════════╣
║ John ║ 2014/03/26 08:00 ║ IN ║ - ║ - ║
║ Mark ║ 2014/03/26 08:12 ║ IN ║ - ║ - ║
║ John ║ 2014/03/26 08:50 ║ OUT ║ 00:40 ║ - ║
║ John ║ 2014/03/26 09:29 ║ IN ║ - ║ 00:39 ║
║ Mark ║ 2014/03/26 10:35 ║ OUT ║ 02:23 ║ - ║
║ John ║ 2014/03/26 10:55 ║ OUT ║ 01:26 ║ - ║
║ Mark ║ 2014/03/26 11:42 ║ IN ║ - ║ 01:07 ║
║ John ║ 2014/03/26 12:05 ║ IN ║ - ║ 01:10 ║
║ John ║ 2014/03/26 16:21 ║ OUT ║ 04:16 ║ - ║
║ Mark ║ 2014/03/26 16:49 ║ OUT ║ 05:07 ║ - ║
╚══════════╩══════════════════╩════════════╩════════╩═════════╝
标准:
- 结果需要由用户按一天计算。如果间隔超过一天,则必须计算每天花费的总时间
- 将忽略双进/出,应使用最外层(因此 in,in,out 表示从先入到出的跟踪时间)
- 我只需要每日结果。如果员工在一天结束时进入,并在第二天退出,它将被忽略。从第一个有效 IN 和最后一个有效 OUT 开始。
- 仅计算有效的 IN 和 OUT 对所花费的时间,排除无法配对的那些(两个或多个连续 IN/OUT)
如何计算 TimeIn 和 TimeOut 的图形表示(针对一名员工):
【问题讨论】:
-
您需要每天的结果吗?还是按用户?从您显示的预期结果中看不清楚。
-
我觉得从sql server获取数据然后用你的代码解析比较容易实现
-
如果有人打卡两次但中间没有打卡怎么办?
-
根据经验,这是一种非常复杂的系统类型,需要建模,因为您通常会开始考虑“如果他在通常 8:00 开始的情况下在 7:15 打卡怎么办。他是否完成了 45 分钟?那么他可以提前离开而不被扣除时间吗?如果他在 6:45 打卡怎么办?如果他当天第一次在 12:00 打卡怎么办,那是合法的还是应该在 9 点之前扣除 1 小时,并且有申请假期/休息时间?午休期间打卡/打卡怎么样?”
-
只计算有效的 IN 和 OUT 对所花费的时间,排除那些无法配对的(两个或多个连续的 IN/OUT)。
标签: sql sql-server datetime