【发布时间】:2015-05-21 19:17:07
【问题描述】:
我有一个 employee_attendance 表 (SQL Server 2012),其中包含以下列:
- AttendanceId(身份)
- 员工编号
- 时间戳(打卡或打卡)
- 访问代码(I = IN,O = OUT)
这是带有一些示例数据的 SQL Fiddle:http://sqlfiddle.com/#!3/ba8a1/1
我知道这些员工可以在我们拥有的 3 个轮班中的任何一天工作:
- 班次 A(从 07:00 到 15:00)
- 班次 B(从 15:00 到 23:00)
- C 班(从 23:00 到次日 07:00)
所以我需要知道每个员工在选定的一天(样本数据只有一天,并且已过滤为仅显示 IN 记录,因此仅显示 IN 访问公司)是第一个靠近(下方或上方)Shift 入口的
Timestamp。
这是应用正确脚本后 SQL Fiddle 数据应该是什么样子的图像:
【问题讨论】:
-
对 sql 摆弄示例数据的做法赞不绝口!
-
对于employee id 116,您指示正确的时间戳是轮班开始前45分钟,而另一个时间戳(15:25:43)则只有25分钟。所以你不是在寻找最近的,对吗?如果 14:15:35 实际上是 12:15:35 怎么办?员工真的会早到还是迟到 25 分钟?数据是否足够干净,可以说在给定的一天中每个员工总是只有一个班次,如果存在,我们总是可以使用早期时间戳,如果不使用晚期时间戳?
-
你怎么知道某人正在轮班?
-
请参阅"Should questions include “tags” in their titles?",其中的共识是“不,他们不应该”!
标签: sql sql-server sql-server-2008