基础-日期函数
1.日期生成类
SELECT NOW();# 返回当前日期与时间 SELECT CURDATE();# 返回当前日期 SELECT CURTIME();# 返回当前时间 SELECT DATE(NOW());# 返回当前日期 SELECT TIME(NOW());# 返回当前时间 SELECT MAKEDATE(2024,355);# 指定年份与第N天返回年份对应的日期,此处返回2024-12-20 SELECT MAKETIME(13,11,31);# 指定时分秒返回时间,此处返回13:11:31
2.日期计算类
# 注意操作时不要超过数据类型的取值范围 # 常规操作 SELECT ADDDATE('2023-04-26',11);# 默认单位为天 SELECT ADDDATE('2023-04-26',INTERVAL 11 DAY); SELECT ADDDATE('2023-04-26',INTERVAL 11 MONTH); SELECT SUBDATE('2024-04-26',INTERVAL 11 WEEK); SELECT SUBDATE('2023-04-26',INTERVAL 11 QUARTER); # SELECT ADDTIME('12:25:31',10);不建议此操作,超过±60则结果错误 SELECT ADDTIME('12:25:31','01:10:22'); SELECT SUBTIME('12:25:31','00:10:22'); # 特殊操作 SELECT ADDDATE('2023-04-26',-38);# 返回'2023-03-19' SELECT SUBDATE('2024-04-26',INTERVAL -11 YEAR);# 返回'2035-04-26' SELECT ADDDATE('2023-04-26',INTERVAL 11 HOUR);# 返回'2023-04-26 11:00:00' SELECT SUBDATE('2023-04-26',INTERVAL 11 MINUTE);# 返回'2023-04-25 23:49:00' SELECT ADDDATE('2024-04-26 12:25:31',INTERVAL 11 SECOND);# 返回'2024-04-26 12:25:42' SELECT SUBDATE('2024-04-26 12:25:31',INTERVAL 11 DAY);# 返回'2024-04-15 12:25:31' # SELECT ADDDATE('12:25:31',INTERVAL 11 SECOND);不可操作 # SELECT SUBDATE('12:25:31',INTERVAL 11 DAY);不可操作 SELECT ADDTIME('2024-04-26 12:25:31','01:10:22');# 返回'2024-04-26 13:35:53' SELECT SUBTIME('2024-04-26 12:25:31','18:10:22');# 返回'2024-04-25 18:15:09' SELECT SUBTIME('2024-04-26 12:25:31','-18:10:22');# 返回'2024-04-27 06:35:53' # SELECT ADDTIME('2023-04-26','01:10:22');不可操作 # SELECT SUBTIME('2023-04-26','00:10:22');不可操作 /* 总结: ADDDATE/SUBDATE可用于日期/日期时间的操作,只能增减形如INTERVAL n Type或n(天),值可正可负, 当日期增减时间时默认把日期转为日期时间,日期部分保持不变,时间为'00:00:00' ADDTIME/SUBTIME可用于时间/日期时间的操作,只能增减形如'01:00:10',值可正可负, 不可增减日期 */ # 数学形式的增减 # SELECT '2023-04-26'+11;不可简化为数字 SELECT '2023-04-26'+INTERVAL 11 YEAR; SELECT '2023-04-26'-INTERVAL 11 SECOND; SELECT '2024-04-26 12:25:31'+INTERVAL 11 YEAR; SELECT '2024-04-26 12:25:31'-INTERVAL 11 SECOND; # SELECT '12:25:31'+'01:00:01';不可操作 # SELECT '12:25:31'-INTERVAL 11 SECOND;不可操作 # SELECT '2024-04-26 12:25:31'+'01:00:01';不可操作 # SELECT '2024-04-26'-'01:00:01';不可操作 /* 总结:等价于ADDDATE/SUBDATE的操作 */ SELECT DATEDIFF('2023-04-26','2021-01-20'); SELECT DATEDIFF('2023-04-26 12:25:31','2021-01-20 02:15:11'); SELECT DATEDIFF('2023-04-26 12:25:31','2021-01-20'); # SELECT DATEDIFF('2023-04-26 12:25:31','02:15:11');不可操作 # SELECT DATEDIFF('12:25:31','02:15:11');不可操作 SELECT TIMEDIFF('12:25:31','02:15:11'); SELECT TIMEDIFF('2023-04-26 12:25:31','2021-01-20 02:15:11'); # SELECT TIMEDIFF('2023-04-26 12:25:31','2021-01-20'); # SELECT TIMEDIFF('2023-04-26 12:25:31','02:15:11'); # SELECT TIMEDIFF('2023-04-26','2021-01-20'); /* 总结: DATEDIFF可用于日期对日期/日期时间对日期时间/日期时间对日期的操作,返回值为天 其中的日期时间本质是被截断为日期,时间部分不参与计算 TIMEDIFF可用于时间对时间/日期时间对日期时间,返回值为标准时间 */ SELECT TIMESTAMPDIFF(DAY,'2023-04-25 13:15:11','2023-04-26 12:25:31');# 返回值为0 SELECT TIMESTAMPDIFF(DAY,'2023-04-25 03:15:11','2023-04-26 12:25:31');# 返回值为1 SELECT TIMESTAMPDIFF(MINUTE,'2023-04-25 03:15:11','2023-04-25 03:25:01');# 返回9 SELECT TIMESTAMPDIFF(HOUR,'2023-04-25','2023-04-25 03:25:01');# 返回3 # SELECT TIMESTAMPDIFF(MINUTE,'03:15:11','2023-04-25 03:25:01');不可操作 /* 总结: TIMESTAMPDIFF可用于日期对日期时间,日期对日期,日期时间对日期时间的操作 日期自动被拓展为日期时间,时间部分为'00:00:00' 重点1:DATEDIFF会将日期时间截断为日期,TIMESTAMPDIFF则会根据所需精度进行舍入!!! 重点2:DATEDIFF为前者减后者,TIMESTAMPDIFF则是后者减前者!!! */
3.格式转换类
SELECT DATE('2023-04-25 13:15:01');# 2023-04-25 SELECT TIME('2023-04-25 13:15:01');# 13:15:01 SELECT MONTH('2023-04-25 13:15:01');# 4 SELECT SECOND('2023-04-25 13:15:01');# 1 SELECT DATE_FORMAT('2023-04-25 13:15:01','%Y%m');# 202304 SELECT DATE_FORMAT('2023-04-25 13:15:01','%Y-%m-%d');# 2023-04-25 SELECT DATE_FORMAT('2023-04-25 13:15:01','%H:%i:%s');# 13:15:01 SELECT DATE_FORMAT('2023-04-25 13:15:01','%h:%i:%s');# 01:15:01 SELECT DATE_FORMAT('2023-04-25 13:15:01','%m');# 04 SELECT DATE_FORMAT('2023-04-25 13:15:01','%s');# 01 /* 总结: DATE_FORMAT会返回标准格式的年月日时分秒,位数不足会补0 形如MONTH位数不足则不补0 */
4.其他类
SELECT LAST_DAY('2023-04-25 13:15:01');# 返回所属月份的最后一天,返回2024-04-30 SELECT LAST_DAY('2024-02-25');# 2024-02-29 SELECT WEEKOFYEAR('2023-02-26'); # 返回本年第几周,从本年第一个周一起每七天数值+1,返回8(首个周一前的日期计入去年最后一周) SELECT WEEKDAY('2024-02-25'); # 返回当前周几,周一至周日:0-6,返回6,即周日 # 更多函数及细节请参考官方文档
5.总结
本文对常用日期函数进行了简单介绍
由于MySQL本身的问题,这些函数有时即使功能类似,语法及使用范围也可能不同,实际使用时应特别注意
对于高频日期函数或特殊日期函数应熟记,前者经常使用,后者则可能对特殊问题有奇效
更多内容请参考官方文档
6.相关题目
简单查询:SQL82 返回 2020 年 1 月的所有订单的订单号和订单日期
涉及分组:SQL28 计算用户8月每天的练题数量
涉及联接:SQLW5 查询连续入住多晚的客户信息?
涉及联接:SQLW10 统计各岗位员工平均工作时长
涉及空值:SQL34 统计复旦用户8月练题情况
涉及联接:SQL280 实习广场投递简历分析(三)
更多知识在专栏
#SQL菜鸟#MySQL的使用 文章被收录于专栏
阅读顺序为:入门->基础(务必阅读,尤其是SELECT语句的执行顺序)->进阶->应用(综合使用)。 这是一部较为系统的大纲式SQL查询教程,学习过程中应同步参考官方文档或其他相关资料,交叉阅读方能更好掌握知识,学会后基本可以完成站内90%以上的相关试题。 DDL及DML的其他内容后续更新。 如有帮助请您点赞收藏订阅,如有疑惑或指正请评论。 共同学习共同进步!