人员编号 姓名 加班名称 刷卡日期 有效开始时间 实际开始时间 有效结束时间
SKY00004 xx 周休加班 2011-01-02 2011-01-02 07:50 2011-01-02 07:50 2011-01-02 12:00
实际结束时间 计划加班时长 实际加班时长
2011-01-02 12:00 4 4SKY00004 xx 周休加班 2011-01-02 2011-01-02 12:33 2011-01-02 12:33 2011-01-02 17:01 2011-01-02 17:01 4 4我想把这两条记录合为一条记录求sql代码怎么写?
先用group by 员工时间 min(startime),max(endtime)获取上午的打卡
最小时间<9点 and 最大时间>12点 扣最小时间和9点和12点到最大时间的总和
最小时间>9点 and 最大时间>12点 扣除12点到最大时间的差值
最小时间>9点 and 最大时间<12点 扣0
最小时间<9点 and 最大时间<12点 扣除最小时间到9点的差值
晚上类似
...
SELECT
人员编号,
姓名,
加班名称,
刷卡日期,
有效开始时间,
实际开始时间 = MIN(实际开始时间),
有效结束时间,
有效结束时间,
实际结束时间 = MAX(实际结束时间),
计划加班时长,
实际加班时长 = DATEDIFF(HOUR, MIN(实际结束时间), MAX(实际开始时间)) -
(
CASE WHEN (DATEPART(HOUR, MAX(实际开始时间)) < 12 AND DATEPART(HOUR, MAX(实际结束时间)) < 18 ) THEN 1 --减去午餐1小时
WHEN (DATEPART(HOUR, MAX(实际开始时间)) > 13 AND DATEPART(HOUR, MAX(实际结束时间)) > 18) THEN 1 --减去晚餐1小时
WHEN (DATEPART(HOUR, MAX(实际开始时间)) < 12 AND DATEPART(HOUR, MAX(实际结束时间)) > 18) THEN 2 --减去午餐和晚餐2小时
--还有其它的情况,比如在午餐或晚餐时间段打的卡,而且DATEPART应该精确到minutes. 本SQL只提供个思路
ELSE 0 END
)
FROM table_name
GROUP BY
人员编号,
姓名,
加班名称,
刷卡日期,
有效开始时间,
有效结束时间,
有效结束时间,
计划加班时长