本帖最后由 yaksha1 于 2020-8-5 16:12 编辑
请教大家一个问题,就是如何计算某个人考勤的总时长。有些人从下午上班一直上到第二天凌晨下班。
考勤可能只打一次,打一次的就属于漏打。第二天8:00之前没有打开记录也属于漏打。
如果有多个时间段,则第一次打卡时间表示开始,第二次打卡时间表示结束。第三次打卡表示开始,第四次表示结束,以此类推。需要求出跨天的考勤时间。
newkid 2020/4/26/周日 上午 10:00:00
newkid 2020/4/26/周日 上午 11:00:00
newkid 2020/4/26/周日 下午 23:00:00
newkid 2020/4/27/周一 上午 03:00:00
xiaoyecha 2020/4/26/周日 下午 12:00:00
xiaoyecha 2020/4/26/周日 下午 14:00:00
OO 2020/4/26/周日 下午 07:00:00 sh 2020/4/30/周日 下午 18:00:00
sh 2020/5/30/周一 上午 02:00:00 ---sh 最后一天跨月了。
newkid 上班总时长就是 10:00-11:00、23:00-03:00 一共5小时考勤时间。
xiaoyecha 12:00-14:00 一共上班2小时,但是第二天8:00之前没有打卡记录,所以属于漏打卡。
OO 上班时间为0 且漏打卡。
测试数据如下:
WITH CTE AS
(SELECT 'newkid' AS NAME,
to_date('4/26/2020 10:00', 'mm/dd/yyyy hh24:mi:ss') AS start_time
FROM DUAL
UNION ALL
SELECT 'newkid' AS NAME,
to_date('4/26/2020 11:00', 'mm/dd/yyyy hh24:mi:ss') AS start_time
FROM DUAL
UNION ALL
SELECT 'newkid' AS NAME,
to_date('4/26/2020 13:00', 'mm/dd/yyyy hh24:mi:ss') AS start_time
FROM DUAL
UNION ALL
SELECT 'newkid' AS NAME,
to_date('4/27/2020 03:00', 'mm/dd/yyyy hh24:mi:ss') AS start_time
FROM DUAL
UNION ALL
SELECT 'xiaoyecha' AS NAME,
to_date('4/26/2020 12:00', 'mm/dd/yyyy hh24:mi:ss') AS start_time
FROM DUAL
UNION ALL
SELECT 'xiaoyecha' AS NAME,
to_date('4/26/2020 14:00', 'mm/dd/yyyy hh24:mi:ss') AS start_time
FROM DUAL
union all
SELECT 'OO' AS NAME,
to_date('4/26/2020 19:00', 'mm/dd/yyyy hh24:mi:ss') AS start_time
FROM DUAL
UNION ALL
SELECT 'sh' AS NAME,
to_date('4/30/2020 18:00', 'mm/dd/yyyy hh24:mi:ss') AS start_time
FROM DUAL
union all
SELECT 'sh' AS NAME,
to_date('5/01/2020 02:00', 'mm/dd/yyyy hh24:mi:ss') AS start_time
FROM DUAL
)
SELECT * FROM CTE;
这个题目,我线下弄出来了,但是感觉语句不够简洁,稍后我放出一下完成的答案,请大神参考下。