需求
有一张表(tb_check_sign)里面有一些员工,上班在九点,九点以后算迟到,统计每一个迟到的次数,如下表所示:
name | desctript | signs |
---|---|---|
王五 | 研发部 | 2021-01-12 08:45:23 |
王五 | 研发部 | 2021-01-12 08:50:43 |
王五 | 研发部 | 2021-01-12 09:10:45 |
李四 | 研发部 | 2021-01-12 09:01:29 |
李四 | 研发部 | 2021-01-12 09:49:40 |
李四 | 研发部 | 2021-01-12 08:47:25 |
赵六 | 研发部 | 2021-01-12 09:25:45 |
赵六 | 研发部 | 2021-01-12 10:15:36 |
赵六 | 研发部 | 2021-01-12 08:43:24 |
王琦 | 研发部 | 2021-01-12 08:26:39 |
王琦 | 研发部 | 2021-01-12 08:30:10 |
王琦 | 研发部 | 2021-01-12 08:34:23 |
Tip:name是员工;descript部门;signs是打卡时间(DateTime类型) |
问题即解决方案
获取某一个时间点的员工迟到的数据:
SELECT COUNT(1) FROM tb_check_sign WHERE signs LINK "% 09:00:00"
获取每一个员工的迟到数量:
SELECT COUNT(1) FROM tb_check_sign WHERE name = "王五" AND DATE_FORMAT(signs, "%H:%i:%S") > "09:00:00";
SELECT COUNT(1) FROM tb_check_sign WHERE name = "李四" AND DATE_FORMAT(signs, "%H:%i:%S") > "09:00:00";
SELECT COUNT(1) FROM tb_check_sign WHERE name = "赵六" AND DATE_FORMAT(signs, "%H:%i:%S") > "09:00:00";
SELECT COUNT(1) FROM tb_check_sign WHERE name = "王琦" AND DATE_FORMAT(signs, "%H:%i:%S") > "09:00:00";
通过日期查询大于2021-01-01的数据
SELECT name, signs FROM tb_check_sign WHERE signs > "2021-01-01";
查询9点这一段时间的数据
SELECT name, signs FROM tb_check_sign WHERE signs LIKE "2021-01-12 09%";
知识点分析
-
DATETIME
是一个日期和时间组合的日期类型,除了它,还有DATE和TIMESTAMP的日期类型,它的格式为"YYYY-MM-DD HH:MM:SS",取值范围在”1000-01-01 00:00:00“至”9999-12-31 23:59:59“ -
DATE_FORMAT()
DATE_FORMAT(data, format)是一个把时间格式化的函数,例如以上案例:
“DATE_FORMAT(signs, "%H:%i:%S")> '09:00:00'"把格式化的时间与九点作比较,大于则为真,统计数据 -
LIKE
是用来检测一个字符串是否包含或不包含,它提供了两个通配符。即"%"与"_","%"表示匹配零个或多个字符,而”_“表示匹配任何单个字符。如以上案例中:
"LIKE '% 09:00:00'"表示匹配九点的所有数据 -
COUNT(*)与COUNT(1)
两者都是表达查询符合条件的数据表中的行数,执行的时间相差不大
参考文献
[1] https://blog.csdn.net/qq_14861089/article/details/53182887
[2] https://blog.csdn.net/ZHOU_VIP/article/details/101778505
[3] https://www.begtut.com/mysql/mysql-datetime.html
[4] https://www.cnblogs.com/yangchunze/p/6669523.html
[5] https://www.begtut.com/mysql/mysql-like.html
[6] https://www.cnblogs.com/hider/p/11726690.html