需求
有一張表(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