考勤签到表的数据结构如下,表名:hrmschedulesign
ID | userid | signdate | signtime | clientaddress |
---|---|---|---|---|
1 | A01 | 2019-06-17 | 08:32:40 | 192.165.16.124 |
1 | A01 | 2019-06-17 | 10:52:30 | 192.175.14.127 |
1 | A01 | 2019-06-17 | 18:32:43 | 192.169.13.125 |
1 | A02 | 2019-06-17 | 09:14:35 | 192.165.18.122 |
(备注:在考勤表中每个用户会有1-N条打卡的记录,以每天的最早时间为签到数据,最晚时间为签退数据,跨天时间不需考虑)
请用SQL查询:昨天所有用户的签到和签退时间:
select userid,min(signtime) startTime,max(signtime) endTime from hrmschedulesign where (sysdate-to_date(signdate,'YYYY-MM-DD'))=1 group by userid;
解释:
我们通过where (sysdate-to_date(signdate,'YYYY-MM-DD'))=1
筛选出昨天的所有数据,由于signdate不是标准的YYYY/MM/DD的形式,所以肯定不是date类型的,因为我们在和sysdate比较的时候需要通过to_date()函数把字符串变成date类型的数据,之后就可以比较了,得出的就是天数,对于signtime来说,可以使用min()和max()进行比较,我虽然不知道为什么可以,不过确实是可以的,最后在通过userid进行分组