SQL分组查询:如何获取当日最小datetime及次日5点前最大datetime?
解决方案
核心问题是调整记录的归属日期逻辑:将凌晨00:00-05:00的打卡记录归到前一天的统计组中,而非记录本身的日期。基于这个逻辑,可修改SQL语句如下:
逻辑说明
- 为每条记录计算实际归属的统计日期:
- 若
datetime的时间部分早于当日05:00,归属日期为datetime对应的日期减1天 - 否则归属日期为
datetime对应的日期
- 若
- 按
person_id和计算出的归属日期分组,取组内最早的datetime作为上班时间(in.),最晚的datetime作为下班时间(out.)
最终SQL语句
SELECT [person_id] AS 'id.' , CASE WHEN CAST([datetime] AS TIME) < '05:00:00' THEN DATEADD(DAY, -1, CAST([datetime] AS DATE)) ELSE CAST([datetime] AS DATE) END AS 'date.' , MIN([datetime]) AS 'in.' , MAX([datetime]) AS 'out.' FROM tablename GROUP BY [person_id] , CASE WHEN CAST([datetime] AS TIME) < '05:00:00' THEN DATEADD(DAY, -1, CAST([datetime] AS DATE)) ELSE CAST([datetime] AS DATE) END
结果验证
针对你的测试数据,这条SQL会:
- 将
2022-01-03 2:00:00的归属日期设为2022-01-02,归入2022-01-02分组并成为该组的out.时间 2022-01-03分组仅包含8:30:00和17:30:00两条记录,对应in.和out.分别为这两个时间- 最终输出完全匹配你的期望结果
内容的提问来源于stack exchange,提问作者Muhamad Akmal
相关产品推荐
相关产品推荐

