一、时间函数
(一)、获取当前时间
1、NOW()
获取当前日期和时间,在程序一开始执行便拿到时间
返回格式 YYYY-MM-DD hh:mm:ss
eg:
NOW() 得到 2023-12-03 12:20:02
NOW(),SLEEP(2),NOW() 得到 2023-12-03 12:20:02 | 0 | 2023-12-03 12:20:02
2、CURDATE()
获取当前日期
返回格式YYYY-MM-DD
eg:
CURDATE() 得到 2023-12-03
3、CURTIME()
获取当前时间
返回格式 hh:mm:ss
eg:
CURTIME() 得到 12:22:02
4、CURDATE()
返回当前日期,仅返回年月日
eg:
CURDATE() 得到 2023-12-05
5、CURRENT_DATE()
返回当前日期,仅返回年月日,与CURDATE()完全相同
eg:
CURRENT_DATE() 得到 2023-12-05
6、CURRENT_TIME()
返回当前时间,仅返回时分秒
eg:
CURRENT_TIME() 得到16:48:47
7、CURRENT_TIMESTAMP()
返回当前时间,仅返回时分秒,与CURRENT_TIME()完全相同
eg:
CURRENT_TIMESTAMP() 得到16:48:47
8、CURTIME()
返回当前时间,仅返回时分秒,与CURRENT_TIME、CURRENT_TIMESTAMP()完全相同
eg:
CURTIME() 得到16:48:47
9、MICROSECOND(expr)
返回指定时间中的微妙部分
eg:
MICROSECOND('12:30:01.000666') 得到 666
10、UTC_DATE
返回当前UTC(世界标准时间)日期,默认YYYY-MM-DD格式或YYYMMDD
11、UTC_TIME
返回当前UTC(世界标准时间)时间,默认hh:mm:ss格式或hhmmss
12、UTC_TIMESTAMP()
返回当前UTC(世界标准时间)日期和时间,默认 YYYY-MM-DD hh:mm:ss格式或 YYYMMDDhhmmss
13、LOCALTIME()
返回当前时间,于NOW()完全相同
eg:
LOCALTIME() 得到 2023-12-06 10:51:02
14、SYSDATE()
返回当前时间,格式同NOW()相同,但不同的是NOW在程序执行开始就得到时间,但SYSDATE是在程序执行完毕之后才得到时间。
eg:
SYSDATE() 得到 2023-12-06 10:56:26
执行 sysdate(), sleep(3), sysdate(); 得到 2023-12-06 10:56:26 | 0 | 2023-12-06 10:56:29
(二)、时间转换、时间提取
1、DATE(date)
将字符串格式的时间转为日期,
eg:
运行DATE('2023-12-03 12:20:02'),得到 2023-12-03;如果传入的字符串中不包含日期,则返回null
2、YEAR(date)
获取传入字符串格式日期中的年
eg:
YEAR('2023-12-03 12:20:02'),得到2023;如果传入的字符串中不包含年,则返回null
传入数据为时间格式时,使用该函数只会返回null;
3、MONTH(date)
获取传入字符串格式日期中的月
eg:
YEAR('2023-12-03 12:20:02'),得到12;如果传入的字符串中不包含月,则返回null
传入数据为时间格式时,使用该函数只会返回null;
4、DAY(date)
获取传入字符串格式日期中的天
eg:
YEAR('2023-12-03 12:20:02'),得到03;如果传入的字符串中不包含日,则返回null;
传入数据为时间格式时,使用该函数只会返回null;
5、HOUR(time)
获取传入字符串格式日期中的小时
eg:
YEAR('2023-12-03 14:20:02'),得到14;如果传入的字符串中不包含小时,则返回null;
传入数据为时间格式时,使用该函数只会返回null;
6、MINUTE(time)
获取传入字符串格式日期中的分钟
eg:
YEAR('2023-12-03 14:20:02'),得到20;如果传入的字符串中不包含分钟,则返回null;
传入数据为时间格式时,使用该函数只会返回null;
7、SECOND(time)
获取传入字符串格式日期中的秒
eg:
YEAR('2023-12-03 14:20:02'),得到2;如果传入的字符串中不包含秒,则返回null;
传入数据为时间格式时,使用该函数只会返回null;
8、DAYNAME(date)
获取传入字符串格式日期对应的星期数,返回的是英文单词
eg:
DAYNAME('2023-12-04'),得到Monday; 传入数据为时间格式时,使用该函数只会返回null;
9、MONTHNAME(date)
获取传入字符串格式日期对应的月份,返回的是英文单词
eg:
DAYNAME('2023-12-04'),得到 December ; 传入数据为时间格式时,使用该函数只会返回null;
10、EXTRACT()
提取字符串中指定日期的时间成分
eg:
假设是获取日期中的小时 EXTRACT(HOUR FROM '2023-12-04 14:02:30'),得到 14
11、 DATE_FORMAT(date,format)
格式化时间的日期格式,date是日期字符串,format是指定的格式
eg:
DATE_FORMAT('2023-12-03','%Y%m%d') 得到20231203;
DATE_FORMAT('2023-12-03','%Y-%m-%d') 得到2023-12-03;
12、TIME_FORMAT(time,format)
格式化时间的时间格式;date是时间字符串,format是指定的格式
eg:
DATE_FORMAT('2023-12-03 12:30:20','%Y%m%d %H:%i:%s') 得到00000000 12:30:20;
从示例可知,即便格式要求了年月日,这个函数也只会返回时分秒,年月日会被0填充
13、TIME_TO_SEC(time)
返回传入时刻与零点的秒数差,多传的年月日会被直接忽略掉
eg:
TIME_TO_SEC('00:00:01'),得到1
TIME_TO_SEC('2023-04-01 00:00:01'),得到1
TIME_TO_SEC(' 00:01'),得到60
14、YEARWEEK(date)
返回传入日期的年份和周数,前四个数是年份,后两个数是周数,既这一天正处于该年第几周
eg:
YEARWEEK('2023-12-05'),得到202349;
YEARWEEK('2023-1-1'),得到202301;
YEARWEEK('2023-1-15'),得到202303;
15、WEEKOFYEAR(date)
返回当前周数(自然周),从每年的第一个周一开始计算的,日期所处年份第一个周一之前的日期全部归为上一年的最后一周的周数;一周从星期一开始算起,过了周日便周数便+1
eg:
WEEKOFYEAR('2023-12-05'),得到49;
WEEKOFYEAR('2023-1-15'),得到02;
值得注意的一点是,我们去计算2022年1月1-3号的周数时,1,2号返回的是51,但3号返回的是1,观察日历可以发现这是因为WEEKOFYEAR计算是以每年的第一个周一开始计算的,而不是从1月1日开始;
WEEKOFYEAR('2022-1-1'),得到52;
WEEKOFYEAR('2022-1-2'),得到52;
WEEKOFYEAR('2022-1-3'),得到1;
16、WEEK(date)
返回当前周数(自然周),从每年的1月1日算起,周数从0开始计算,每年第一周为0;一周从周日开始计算,过了周六周数便 +1
eg:
WEEK('2022-1-1'),得到0;
WEEK('2022-1-2'),得到1;
WEEK('2022-1-2'),得到1;
WEEK('2022-1-4'),得到1;
WEEK('2022-1-5'),得到1;
WEEK('2022-1-6'),得到1;
WEEK('2022-1-7'),得到1;
WEEK('2022-1-8'),得到1;本日是周六
WEEK('2022-1-9'),得到2;
17、DAYOFYEAR(date)
提取当前日期在本年的天数
eg:
DAYOFYEAR('2022-01-9'),得到9;
DAYOFYEAR('2022-02-9') 得到40
18、DAYOFMONTH(date)
返回当前日期在所在的月的天数,给予错误日期返回null
eg:
DAYOFMONTH('2022-02-28'),得到28
DAYOFMONTH('2022-02-29'),得到null
19、DAYOFWEEK(date)
返回是当天日期中一周的第几天,该函数一周从周日开始
eg:
DAYOFWEEK('2022-01-1') 得到7
DAYOFWEEK('2022-01-2') 得到1
20、LAST_DAY(date)
返回该月的最后一天
eg:
LAST_DAY('2022-01-2')得到 2022-01-31;
LAST_DAY('2022-02-02') 得到2022-02-28;
21、UNIX_TIMESTAMP()
返回一个UNIX时间戳
eg:
UNIX_TIMESTAMP() 得到 1701753714
UNIX_TIMESTAMP('2023-01-01 12:00:00') 得到 1672545600
22、FROM_UNIXTIME(unix_timestamp,format)
将时间戳按照指定时间格式返回,unix_timestamp 是时间戳,该字段为必填项;format 是数据格式,为选填项,不填默认是 YYYY-MM-DD hh:mm:ss 的格式
eg:
FROM_UNIXTIME(1701753829) 得到:2023-12-05 13:23:49
FROM_UNIXTIME(1701753830,'%H:%i:%s %Y-%m-%d') 得到:13:23:50 2023-12-05
23、WEEKDAY(date)
返回指定时间所处的星期二数,周一至周日 由0-6表示
eg:
WEEKDAY('2023-12-5') 该日为周二,得到返回值 1
WEEKDAY('2023-12-4') 该日为周一,得到返回值 0
WEEKDAY('2023-12-10') 改日为周日,得到返回值 6
24、FROM_DAYS(N)
返回距离公元0年N天所代表的日期,N代表天数,当N处于0-365天时,返回的是0000-00-00, 2000-1-1号的日期是730485
eg:
FROM_DAYS(0) 得到0000-00-00
FROM_DAYS(365) 得到 0000-00-00;
FROM_DAYS(366) 得到0001-01-01;
FROM_DAYS(367) 得到0001-01-02
25、TO_DAYS(date)
返回给定日期距离公元0年的天数,date是日期
eg:
TO_DAYS('2000-01-01') 得到 730485
TO_DAYS('0000-00-00') 得到 null
TO_DAYS('0001-01-01') 得到366
26、LAST_DAY(date)
返回指定日所处月份的最后一天的日期,date 必须是年月日格式,若只给年月则会返回null
eg:
LAST_DAY('2023-02-01') 得到2023-02-28;
LAST_DAY('2023-02') 得到 null
27、MAKEDATE(year,dayofyear)
根据给定年份和指定天数,返回该年中这一天所处的日期;year 是年份,dayofyear 是天数
eg:
MAKEDATE(2023,20) 得到 2023-01-20
MAKEDATE(2023,360) 得到 2023-12-26
28、STR_TO_DATE(str,format)
将打乱的时间字符串根据指定的时间格式映射后按照 YYYY-MM-DD hh:mm:ss 的时间格式,返回有的时间,若指定的时间格式在字符串中无法找到,则将对应的数据用0填充
eg:
STR_TO_DATE('12,20,09 2023-01-05','%H,%i,%s %Y-%m-%d') 得到 2023-01-05 12:20:09
STR_TO_DATE('12,20,09','%H,%i,%s %Y-%m-%d') 得到 0000-00-00 12:20:09
STR_TO_DATE('12,20,09','%H,%i,%s') 得到 12:20:09
29、Time(expr)
返回给定日期中,仅关于时间的部分
eg:
TIME('2023-01-01 12:30:09') 得到 12:30:09
30、MAKETIME(hour,minute,second)
根据给定时分秒组装返回一个时间,minute和second的取值只能在0-59,否则会返回null
eg:
MAKETIME(23,01,20) 得到 23:01:20
MAKETIME(-100,50,50) 得到 -100:50:50
MAKETIME(10,60,50) 得到null
31、SEC_TO_TIME(seconds)
将传入的秒数转换为 hh:mm:ss 的时间值,秒数可为负值
eg:
SEC_TO_TIME(10) 得到 00:00:10
SEC_TO_TIME(-10) 得到 -00:00:10
SEC_TO_TIME(100) 得到 00:01:40
32、QUARTER(date)
一年按照每3个月为一个季度的规律,总共分为4个季度,改函数是根据给定的日期字符串判断出该日期处于那个季度
eg:
QUARTER('2023-01-01') 得到1;
QUARTER('1-01') 得到null,表示只给月和日是不行的
QUARTER('0000-07-01') 得到3
33、TO_SECONDS(expr)
返回根据给定日期到公元0年的秒数
eg:
TO_SECONDS('0000-01-01') 得到 86400
TO_SECONDS('01-01') 的到 null
34、CONVERT_TZ(dt,from_tz,to_tz)
将一个时区的时间转换为另一个时区的时间并返回;
- dt: 为时间
- from_tz :为该时间本身的时区
- to_tz: 为要转换的时区;
eg:
CONVERT_TZ('2022-01-01 14:00:00', 'GMT', 'MET') 得到 2022-01-01 15:00:00
(三)、时间计算
1、DATE_ADD(date,INTERVAL expr type)
对日期进行加法计算; date是日期,INTRRVAL是关键字, expr 是指要操作的时间数,type是要操作的时间数的单位;
expr 为正数时表示加,为负数时表示减
eg:
DATE_ADD('2023-12-03',INTERVAL 1 DAY),得到2023-12-04,这个操作是在指定的日期上加上一天
DATE_ADD('2023-12-03',INTERVAL -1 YEAR),得到2022-12-03,这个操作是在指定的日期上减去一年
expr 为正数是表示加,为负数时表示减去
2、DATE_SUB(date,INTERVAL expr type)
对日期进行减法计算; date是日期,INTRRVAL是关键字, expr 是指要操作的时间数,type是要操作的时间数的单位;
expr 为正数时表示减,为负数时表示加
eg:
DATE_ADD('2023-12-03',INTERVAL -1 DAY),得到2023-12-04,这个操作是在指定的日期上加上一天
DATE_ADD('2023-12-03',INTERVAL 1 YEAR),得到2022-12-03,这个操作是在指定的日期上减去一年
3、DATEDIFF(expr1,expr2)
返回两个日期相隔的天数;expr1为时间1,expr2为时间2,当expr1<expr2时,返回的值是负数,当expr1>expr2 时,返回的天数是正数
eg:
DATEDIFF('2023-03-01','2023-04-01'),得到 -31;
DATEDIFF('2023-04-01','2023-03-01'),得到 31
4、ADDDATE()
返回对指定日期的增减时间操作后得到的日期,操作的日期为正数则是增,为负数则是减
该函数有两种模式:
- 模式一: ADDDATE(date,INTERVAL expr unit),指定操作日期单位
- 模式二:ADDDATE(expr,days),默认操作日期单位为天
eg:
ADDDATE('2022-01-01',INTERVAL 1 month), 得到 2022-02-01
ADDDATE('2022-01-01',3) 得到 2022-01-04
ADDDATE('2022-01-01',INTERVAL -1 month) 得到2021-12-01
ADDDATE('2022-01-01',-3) 得到 2021-12-29
5、SUBDATE()
返回对指定日期的增减时间操作后得到的日期
该函数有两种模式:
- 模式一: SUBDATE(date,INTERVAL expr unit),可指定操作日期单位
- 模式二:SUBDATE(expr,days),默认操作日期单位为天
eg:
SUBDATE('2022-01-01',INTERVAL 1 month), 得到 2021-12-01
SUBDATE('2022-01-01',3) 得到 2021-12-29
SUBDATE('2022-01-01',INTERVAL -1 month) 得到2022-02-01
SUBDATE('2022-01-01',-3) 得到 2022-01-04
6、TIMESTAMPDIFF(unit,expr1,expr2)
返回两个指定日期的时间差;unit指返回时间差转换的单位,expr1、expr2是两个时间,当expr1<expr2 返回正数,当expr1>expr2返回负数,当返回的时间差不足1的时候,会被舍去。
eg:
TIMESTAMPDIFF(HOUR,'2022-01-01 12:30:00','2022-01-01 17:30:00') 得到 5
TIMESTAMPDIFF(HOUR,'2022-01-01 17:30:00','2022-01-01 12:30:00') 得到-5
TIMESTAMPDIFF(HOUR,'2022-01-01 17:00:00','2022-01-01 12:30:00')得到 -4,多余出来的半小时做了舍操作
TIMESTAMPDIFF(HOUR,'2022-01-01 12:59:00','2022-01-01 12:01:00') 得到 0,及不满1小时,则直接返回0
7、TIMEDIFF(expr1,expr2)
返回两个时间的差值,expr1<expr2时返回负值,expr1>expr2时返回正值,当单位更小的时间不够时,会从大的时间单位中借调1位
eg:
TIMEDIFF('12:01:01','13:05:06') 得到:-01:04:05
TIMEDIFF('13:05:06','13:04:05') 得到 00:01:01
TIMEDIFF('13:05:06','13:04:07')得到:00:00:59
8、TIMESTAMP(expr1,expr2)
将传入的一或两个时间合并转化为一个日期时间;
eg:
TIMESTAMP('2023-12-01') 得到 2023-12-01 00:00:00;
TIMESTAMP('2023-12-01',1) 得到 2023-12-01 00:00:01
TIMESTAMP('2023-12-01','12:20:03') 得到 2023-12-01 12:20:03
9、TIMESTAMPADD(unit,interval,datetime_expr)
将一个时间数加至指定的时间上,并返回新的时间
- unix: 为添加时所指定的时间单位;
- interval: 为添加时所指定的时间数量;
- datetime_expr:为指定的时间
eg:
TIMESTAMPADD(day,5,'2023-12-01') 得到 2023-12-06
TIMESTAMPADD(week,2,'2023-12-01') 得到 2023-12-15
10、ADDTIME(expr1,expr2)
给指定的时间加上一段时间间隔,并得到新的时间,若expr2为负数,则表示减去一段时间间隔
- expr1 : 指定的时间
- expr2 : 给定的时间间隔
eg:
ADDTIME('12:03:02',10) 得到 12:03:12
ADDTIME('10:03:02','2:05:06') 得到 12:08:08
ADDTIME('10:03:02',200) 得到10:05:02,此处200被默认解析为00:02:00
ADDTIME('10:03:02',2000) 得到 10:23:02
ADDTIME('10:30:30',-2000) 得到 10:10:30
11、SUBTIME(expr1,expr2)
给指定的时间减去一段时间间隔,并得到新的时间,若是-expr2为负数,则会变为增加一段时间间隔
- expr1 : 指定的时间
- expr2 : 给定的时间间隔
eg:
SUBTIME('2023-01-01 10:30:30',30) 得到 2023-01-01 10:30:00
SUBTIME('2023-01-01 10:30:30',3000) 得到 2023-01-01 10:00:30,3000被切割为 30:00
SUBTIME('10:30:30',-20) 得到 10:30:50
12、PERIOD_ADD(P,N)
返回给指定的日期上加上指定的月数的结果,
- P: 指定的日期,必须是 年月的格式,年和月中间不能有符号
- N: 指定的月数,仅为整数,当为负值时,表示减去指定的月数
eg:
PERIOD_ADD('202005',5) 得到 202010
PERIOD_ADD('202005',-5) 得到 201912
13、PERIOD_DIFF(P1,P2)
返回给定两个日期相隔的月数,当P1<P2时为负,P1>P2时为正;
eg:
PERIOD_DIFF(202301,202309) 得到 -9;
PERIOD_DIFF(202304,202302) 得到 2
二、时间函数小提示
很多时间函数根据其被运用在不同语境,数字或者字符串语境中会返回不同的时间格式。
比如以UTC_DATE为例,当他返回日期的时候,默认返回的格式是YYYY-MM-DD,
但如果你想要它返回YYYMMDD的格式,你可以在这个函数后给他加个0,
eg:
UTC_DATE() 得到 2023-12-06
UTC_DATE()+0 得到 20231206
三、函数中 format 参数的格式
- %Y : 4位的年
- %y :2位的年份
- %M :月份的英文全名(January..December)
- %m :2位的月份(00...12)
- %b:月份的缩写 (Jan..Dec)
- %c : 月份数字 (0..12)
- %W:星期的全名 (Sunday..Saturday)
- %w:星期的缩写(0..6 对应周一至周六)
- %a 星期的缩写
- %X: 一年中的星期,每周的开始是星期天,四位数字,用于 %V
- %x : 一年中的星期,每周的开始是星期一,四位数字,用于 %v
- %U : 一年中的星期 (00..53), 每周的开始是星期天; WEEK() 函数中的 mode 0
- %u : 一年中的星期 (00..53), 每周的开始是星期一; WEEK() 函数中的 mode 1
- %V : 一年中的星期 (01..53), 每周的开始是星期天; WEEK() 函数中的 mode 2, 用于 %X
- %v : 一年中的星期 (01..53), 每周的开始是星期一; WEEK() 函数中的 mode 3, 用于 %x
- %D: 带有英语前缀的月份中的每天 (0th, 1st, 2nd, 3rd, …)
- %d : 月份中的每天的两位数字表示 (00..31)
- %e : 月份中的每天的数字表示 (0..31)
- %j : 一年中的每天 (001..366)
- %d:2位的日期
- %H:24小时制的小时
- %h:12小时制的小时
- %T: 二十四小时制时间 (hh:mm:ss)
- %r : 十二小时制时间 (hh:mm:ss 后跟 AM 或 PM)
- %p : AM 或者 PM
- %i :2位的分钟(00...59)
- %S : 秒 (00..59)
- %s :2位的秒钟(00...59)
- %f : 微秒 (000000..999999)
参考资料:MYSQL日期函数_MYSQL时间函数详解和实战(你想要的都有70多个函数几百种用法建议收藏以备查阅)
MySQL str_to_date()函数
MySQL中的日期函数 - 知乎
mysql输出当前是第几周使用week和weekofyear的区别
最全总结---36种MySQL时间函数
mysql的sysdate_MySQL获取时间及日期的函数--sysdate()
感谢以上大佬的整理和共享!!!❀❀❀