基础-日期函数

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

全部评论

相关推荐

03-14 10:50
已编辑
门头沟学院 Java
鼠鼠华子无线实习,bg双九,通软岗位,论文,专利,竞赛都水过一点,秋招《非all in》选手,《泡池子泡到肿》选手,分享一下自己的时间线,给大家多一个参考。---实习末期,接口人电话沟通,最终决定求稳继续投递实习原部门---免机试,九月走完线下流程,开始入池---十月起开始保温,打听手中已拿offer,比较薪资,给出华子的预估职级和薪资(完全不给A的空间)---十月第二次保温,询问签约情况,各种暗示劝说留空白三方---十月底签约另一家公司,遂被降低优先级---十一月若干次常规保温信息(还有机会/稍晚一点/等这周。。。)---十二月告知部门有13的指标,愿意接受可以立刻发offer(难绷,妄图性...
蓦然回首一枝花:能体会楼主的心情,我投了华为无线的成研所,双9bg,被华子最后开了个13级的侮辱价 12.3打oc电话的时候接口人表示乐观等待就行,然后中间4周就开始不回消息或者拖四五天才回,翻来覆去就是“等审批结果”。 12月27号,我看应该是泡不出来了所以联系了部门流转,这时候接口人开始主动给我打电话告诉我马上就能出结果了,于是我也没继续流转。 12.31给我打电话说得降薪审批,薪资大概就是对应着13级的样子,但我当时因为投的是成都的,没有意识到薪资是按照上海开的,还以为这个薪资在成都是14级,加上那个时候我也“孝”劲上来了,想着能收我就行,于是答应了。 1.13开了出来,联系我了薪资,确认了下发现是13级,当时实在是接受不了,于是最终还是拒了。 拒的时候接口人告诉我说这个hc真的是他们争取了很久才争取到的,不过我一想到我12.3就打了oc电话,中间4周一直不搭理我或吊着我,最后12.31才告诉我争取不下来14级要降薪,也许争取真的要争取那么久吧,呵。 这个过程中也为华为拒了不少offer,大厂的、央企的、银行的都拒过,网上总说“华为没有发小奖状之前hr的话一个字都不要信”,当时没有放在心上,以为不会摊到我头上,现在来看当时也挺年轻气盛的。我感觉要不是中途我一直在烦hr,可能我就和楼主一样被泡死了吧,不过最后给开了个13级也和泡死没差,不过是被多侮辱了一次。 最后借楼主这个贴就只想跟后面的人提一个建议吧,还是那句说烂了的,“华为没有发小奖状之前hr的话一个字都不要信”,真的不要以为这样的情况不会出现在自己身上,不要拿自己的一辈子前途去送华为hr业绩。
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客企业服务