基础-日期函数

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的其他内容后续更新。 如有帮助请您点赞收藏订阅,如有疑惑或指正请评论。 共同学习共同进步!

全部评论

相关推荐

点赞 2 评论
分享
牛客网
牛客企业服务