简介
本文主要讲解MySQL中的日期时间函数,包括:NOW、CURRENT_TIMESTAMP、CURDATE、CURRENT_DATE、CURTIME、CURRENT_TIME、STR_TO_DATE、DATE_FORMAT、TIME_FORMAT、DATE、TIME、YEAR、MONTH、DAY、HOUR、MINUTE、SECOND、QUARTER、YEARWEEK、WEEKDAY、DAYOFYEAR、WEEKOFYEAR、TO_DAYS、FROM_DAYS、TO_SECONDS、UNIX_TIMESTAMP、FROM_UNIXTIME、TIMEDIFF、TIMESTAMPDIFF、DATEDIFF、ADDDATE、DATE_ADD、ADDTIME、SUBDATE、DATE_SUB、SUBTIME。
以下所有示例中,双横杠“--”左边为执行的SQL语句,右边为对应语句的返回值。
NOW函数
语法:NOW(),返回当前日期时间。
示例:
select NOW();-- 2025-01-20 20:18:30
CURRENT_TIMESTAMP函数
语法:CURRENT_TIMESTAMP(),返回当前时间戳,即当前日期时间。
示例:
select CURRENT_TIMESTAMP();-- 2025-01-20 21:17:45
CURDATE函数
语法:CURDATE(),返回当前日期。
示例:
select CURDATE();-- 2025-01-20
CURRENT_DATE函数
语法:CURRENT_DATE(),返回当前日期。
示例:
select CURRENT_DATE();-- 2025-01-20
CURTIME函数
语法:CURTIME(),返回当前时间。
示例:
select CURTIME();-- 21:13:09
CURRENT_TIME函数
语法:CURRENT_TIME(),返回当前时间。
示例:
select CURRENT_TIME();-- 21:16:33
STR_TO_DATE函数
语法:STR_TO_DATE(str,format),表示将字符串str转换为指定format格式的日期时间值。
示例如下:
select STR_TO_DATE('2025-01-20', '%Y-%m-%d %H:%i:%s');-- 2025-01-20 00:00:00
select STR_TO_DATE('2025-01-20', '%Y-%m-%d');-- 2025-01-20
select STR_TO_DATE('2025-01-20 12:18:18', '%Y-%m-%d');-- 2025-01-20
select STR_TO_DATE('2025-01-20', '%Y-%m');-- NULL
select STR_TO_DATE('2025-01-20', '%Y');-- NULL
select STR_TO_DATE('2025-01-20', '%m');-- NULL
DATE_FORMAT函数
语法:DATE_FORMAT(date,format),表示将日期时间值date转化为指定format格式的字符串。
示例如下:
select DATE_FORMAT('2025-01-20 12:18:18', '%Y-%m-%d %H:%i:%s');-- 2025-01-20 12:18:18
select DATE_FORMAT('2025-01-20', '%Y-%m-%d %H:%i:%s');-- 2025-01-20 00:00:00
select DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');-- 2025-01-20 20:48:01
select DATE_FORMAT(NOW(), '%Y-%m-%d');-- 2025-01-20
select DATE_FORMAT(NOW(), '%H:%i:%s');-- 20:48:48
select DATE_FORMAT(CURDATE(), '%Y-%m-%d %H:%i:%s');-- 2025-01-20 00:00:00
select DATE_FORMAT(CURTIME(), '%Y-%m-%d %H:%i:%s');-- 2025-01-20 20:49:05
TIME_FORMAT函数
语法:TIME_FORMAT(time,format),表示将时间值time转化为指定format格式的字符串。
示例:
select TIME_FORMAT('2025-01-20 12:18:18', '%Y-%m-%d %H:%i:%s');-- 0000-00-00 12:18:18
select TIME_FORMAT('2025-01-20 12:18:18', '%H:%i:%s');-- 12:18:18
select TIME_FORMAT('12:18:18', '%H:%i:%s');-- 12:18:18
select TIME_FORMAT(NOW(), '%H:%i:%s');-- 20:57:01
select TIME_FORMAT(CURDATE(), '%H:%i:%s');-- 00:00:00
select TIME_FORMAT(CURTIME(), '%H:%i:%s');-- 20:57:53
DATE函数
语法:DATE(expr),从日期时间expr中取日期部分。
示例:
select DATE('2025-01-20 12:18:18');-- 2025-01-20
select DATE('2025-01-20');-- 2025-01-20
TIME函数
语法:TIME(expr),从日期时间expr中取时间部分。
示例:
select TIME('2025-01-20 12:18:18');-- 12:18:18
select TIME('12:18:18');-- 12:18:18
YEAR函数
语法:YEAR(expr),从日期时间expr中取年份。
示例:
select YEAR('2025-01-20 12:18:18');-- 2025
select YEAR('2025-01-20');-- 2025
MONTH函数
语法:MONTH(expr),从日期时间expr中取月份。
示例:
select MONTH('2025-01-20 12:18:18');-- 1
select MONTH('2025-01-20');-- 1
DAY函数
语法:DAY(expr),从日期时间expr中取天数。
示例:
select DAY('2025-01-20 12:18:18');-- 20
select DAY('2025-01-20');-- 20
HOUR函数
语法:HOUR(expr),从日期时间expr中取小时。
示例:
select HOUR('2025-01-20 12:18:18');-- 12
select HOUR('12:18:18');-- 12
MINUTE函数
语法:MINUTE(expr),从日期时间expr中取分钟。
示例:
select MINUTE('2025-01-20 12:18:18');-- 18
select MINUTE('12:18:18');-- 18
SECOND函数
语法:SECOND(expr),从日期时间expr中取秒数。
示例:
select SECOND('2025-01-20 12:18:58');-- 58
select SECOND('12:18:58');-- 58
QUARTER函数
语法:QUARTER(expr),从日期时间expr中取季度。
示例:
select QUARTER('2025-01-20 12:18:58');-- 1
select QUARTER('2025-06-18');-- 2
YEARWEEK函数
语法:YEARWEEK(expr),从日期时间expr中取年份和周数,即哪一年第几周。
示例:
select YEARWEEK('2025-01-20 12:18:58');-- 202503
select YEARWEEK('2025-02-18');-- 202507
WEEKDAY函数
语法:WEEKDAY(expr),从日期时间expr中取周数,即第几周。
示例:
select WEEKDAY('2025-01-08 12:18:58');-- 2
select WEEKDAY('2025-01-20 12:18:58');-- 0
select WEEKDAY('2025-02-18');-- 1
select WEEKDAY('2025-02-20');-- 3
DAYOFYEAR函数
语法:DAYOFYEAR(date),返回日期时间date在其所属年份中是第几天。
示例:
SELECT DAYOFYEAR('2025-01-21 12:08:18');-- 21
SELECT DAYOFYEAR('2025-08-20');-- 232
WEEKOFYEAR函数
语法:WEEKOFYEAR(date),返回日期时间date在其所属年份中是第几周。
示例:
SELECT WEEKOFYEAR('2025-01-28 12:08:18');-- 5
SELECT WEEKOFYEAR('2025-08-15');-- 33
TO_DAYS函数
语法:TO_DAYS(date),将日期时间date转化为天数。
示例:
SELECT TO_DAYS('2025-08-18 12:08:18');-- 739846
SELECT TO_DAYS('2025-08-18');-- 739846
SELECT TO_DAYS(NOW());-- 739637
FROM_DAYS函数
语法:FROM_DAYS(N),将天数N转化为日期,返回格式为【%Y-%m-%d】。
示例:
SELECT FROM_DAYS(739846);-- 2025-08-18
TO_SECONDS函数
语法:TO_SECONDS(expr),将日期时间expr转化为秒数。
示例:
SELECT TO_SECONDS('2025-01-08');-- 63903513600
SELECT TO_SECONDS('2025-01-08 12:18:58');-- 63903557938
SELECT TO_SECONDS(NOW());-- 63904679500
UNIX_TIMESTAMP函数
语法:UNIX_TIMESTAMP(expr),返回日期时间expr对应的时间戳数值,若参数为空,则返回当前时间的时间戳数值。
示例:
select UNIX_TIMESTAMP('2025-01-20 12:18:58');-- 1737346738
select UNIX_TIMESTAMP('2025-02-18');-- 1739808000
select UNIX_TIMESTAMP();-- 1737380925
FROM_UNIXTIME函数
语法:FROM_UNIXTIME(expr),返回时间戳数值expr对应的日期时间,参数不能为空。
示例:
select FROM_UNIXTIME(1737346738);-- 2025-01-20 12:18:58
select FROM_UNIXTIME(1739808000);-- 2025-02-18 00:00:00
TIMEDIFF函数
语法:TIMEDIFF(expr1,expr2),返日期时间expr1和日期时间expr2之间的时间差,只计算两个时间中时分秒部分的差值,返回值格式为【%H:%i:%s】,若expr1大于expr2,则返回正值,若expr1小于expr2,则返回负值。
示例:
select TIMEDIFF('2025-01-08 12:18:58','2025-01-08 11:08:58');-- 01:10:00
select TIMEDIFF('2025-01-08 12:18:58','2025-01-08 13:18:58');-- 返回:-01:00:00
select TIMEDIFF('13:18:58','11:18:58');-- 02:00:00
select TIMEDIFF('2025-01-08','2025-01-18');-- 00:00:00
select TIMEDIFF('12:18:58','12:08:58');-- 00:10:00
select TIMEDIFF('12:18:58','12:18:58');-- 00:00:00
TIMESTAMPDIFF函数
语法:TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2),返日期时间datetime_expr1和日期时间datetime_expr2之间的时间差,unit表示时间差值的单位,可以是YEAR、MONTH、DAY、HOUR、MINUTE、SECOND;若datetime_expr1小于datetime_expr2,则返回正值,若expr1大于expr2,则返回负值。
示例:
SELECT TIMESTAMPDIFF(DAY,'2025-01-21 12:08:18','2025-01-29 12:08:18');-- 8
SELECT TIMESTAMPDIFF(DAY,'2025-01-29 12:08:18','2025-01-21 12:08:18');-- 返回:-8
SELECT TIMESTAMPDIFF(DAY,'2025-01-21 12:08:18','2025-02-25 12:08:18');-- 35
SELECT TIMESTAMPDIFF(DAY,'2025-01-21','2026-02-25');-- 400
SELECT TIMESTAMPDIFF(DAY,NOW(),'2024-12-28');-- -24
SELECT TIMESTAMPDIFF(MONTH,'2025-01-21','2026-02-25');-- 13
SELECT TIMESTAMPDIFF(YEAR,'2025-01-21','2026-02-25');-- 1
SELECT TIMESTAMPDIFF(HOUR,'2025-01-21 12:08:18','2025-02-25 12:08:18');-- 840
SELECT TIMESTAMPDIFF(MINUTE,'2025-01-21 12:08:18','2025-02-25 12:08:18');-- 50400
SELECT TIMESTAMPDIFF(SECOND,'2025-01-21 12:08:18','2025-02-25 12:08:18');-- 3024000
DATEDIFF函数
语法:DATEDIFF(expr1,expr2),返日期时间expr1和日期时间expr2之间的天数差,只计算两个时间中年月日部分的差值,若expr1大于expr2,则返回正值,若expr1小于expr2,则返回负值。
示例:
select DATEDIFF('2025-01-08 12:18:58','2025-01-08 11:08:58');-- 0
select DATEDIFF('2025-01-08','2025-01-18');-- 返回:-10
select DATEDIFF('2025-01-18','2025-01-08');-- 10
select DATEDIFF('2025-01-08','2025-01-08');-- 0
select DATEDIFF('13:18:58','11:18:58');-- NULL
ADDDATE函数
语法:
第一种:ADDDATE(date,INTERVAL expr unit),返回日期时间date加上一段时间expr后的日期时间,unit是expr的单位,可以是YEAR、MONTH、DAY、HOUR、MINUTE、SECOND。
第二种:ADDDATE(expr,days),返回日期时间expr加上指定天数days后的日期时间。
示例:
SELECT ADDDATE('2025-01-21', INTERVAL 8 DAY);-- 2025-01-29
SELECT ADDDATE('2025-01-21', INTERVAL 2 MONTH);-- 2025-03-21
SELECT ADDDATE('2025-01-21', INTERVAL 1 YEAR);-- 2026-01-21
SELECT ADDDATE('2025-01-21', 8);-- 2025-01-29
SELECT ADDDATE('2025-01-21 12:08:18', INTERVAL 8 DAY);-- 2025-01-29 12:08:18
SELECT ADDDATE('2025-01-21 12:08:18', INTERVAL 8 HOUR);-- 2025-01-21 20:08:18
SELECT ADDDATE('2025-01-21 12:08:18', INTERVAL 8 MINUTE);-- 2025-01-21 12:16:18
SELECT ADDDATE('2025-01-21 12:08:18', INTERVAL 8 SECOND);-- 2025-01-21 12:08:26
SELECT ADDDATE(NOW(), INTERVAL 8 DAY);-- 2025-01-29 10:42:36
SELECT ADDDATE(CURDATE(), INTERVAL 8 DAY);-- 2025-01-29
DATE_ADD函数
语法:DATE_ADD(date,INTERVAL expr unit),返回日期时间date加上一段时间expr后的日期时间,unit是expr的单位,可以是YEAR、MONTH、DAY、HOUR、MINUTE、SECOND,效果与ADDDATE函数相同,但是不支持DATE_ADD(expr,days)用法。
示例:
SELECT DATE_ADD('2025-01-21', INTERVAL 8 DAY);-- 2025-01-29
SELECT DATE_ADD('2025-01-21', INTERVAL 2 MONTH);-- 2025-03-21
SELECT DATE_ADD('2025-01-21', INTERVAL 1 YEAR);-- 2026-01-21
SELECT DATE_ADD('2025-01-21 12:08:18', INTERVAL 8 DAY);-- 2025-01-29 12:08:18
SELECT DATE_ADD('2025-01-21 12:08:18', INTERVAL 8 HOUR);-- 2025-01-21 20:08:18
SELECT DATE_ADD('2025-01-21 12:08:18', INTERVAL 8 MINUTE);-- 2025-01-21 12:16:18
SELECT DATE_ADD('2025-01-21 12:08:18', INTERVAL 8 SECOND);-- 2025-01-21 12:08:26
SELECT DATE_ADD(NOW(), INTERVAL 8 DAY);-- 2025-01-29 10:49:49
SELECT DATE_ADD(CURDATE(), INTERVAL 8 DAY);-- 2025-01-29
SELECT DATE_ADD('2025-01-21', 8);-- 报错:[Err] 1064
ADDTIME函数
语法:ADDTIME(expr1,expr2),返回日期时间expr1加上一段时间expr2后的日期时间,expr2可以是一个纯数值,也可以是时分秒的格式。
示例:
SELECT ADDTIME('2025-01-21 12:08:18',8);-- 2025-01-21 12:08:26
SELECT ADDTIME('2025-01-21 12:08:18',8.88);-- 2025-01-21 12:08:26.880000
SELECT ADDTIME('2025-01-21 12:08:18','8');-- 2025-01-21 12:08:26
SELECT ADDTIME('2025-01-21 12:08:18','8.88');-- 2025-01-21 12:08:26.880000
SELECT ADDTIME('2025-01-21 12:08:18','12:00:00');-- 2025-01-22 00:08:18
SELECT ADDTIME('2025-01-21 12:08:18','12:00:00.88');-- 2025-01-22 00:08:18.880000
SELECT ADDTIME('2025-01-21 12:08:18','2025-01-21 12:00:00');-- NULL
SUBDATE函数
语法:
第一种:SUBDATE(date,INTERVAL expr unit),返回日期时间date减去一段时间expr后的日期时间,unit是expr的单位,可以是YEAR、MONTH、DAY、HOUR、MINUTE、SECOND。
第二种:SUBDATE(expr,days),返回日期时间expr减去指定天数days后的日期时间。
示例:
SELECT SUBDATE('2025-01-21', INTERVAL 8 DAY);-- 2025-01-13
SELECT SUBDATE('2025-01-21', INTERVAL 2 MONTH);-- 2024-11-21
SELECT SUBDATE('2025-01-21', INTERVAL 1 YEAR);-- 2024-01-21
SELECT SUBDATE('2025-01-21', 8);-- 2025-01-13
SELECT SUBDATE('2025-01-21 12:08:18', INTERVAL 8 DAY);-- 2025-01-13 12:08:18
SELECT SUBDATE('2025-01-21 12:08:18', INTERVAL 8 HOUR);-- 2025-01-21 04:08:18
SELECT SUBDATE('2025-01-21 12:08:18', INTERVAL 8 MINUTE);-- 2025-01-21 12:00:18
SELECT SUBDATE('2025-01-21 12:08:18', INTERVAL 8 SECOND);-- 2025-01-21 12:08:10
SELECT SUBDATE(NOW(), INTERVAL 8 DAY);-- 2025-01-13 11:09:06
SELECT SUBDATE(CURDATE(), INTERVAL 8 DAY);-- 2025-01-13
DATE_SUB函数
语法:DATE_SUB(date,INTERVAL expr unit),返回日期时间date减去一段时间expr后的日期时间,unit是expr的单位,可以是YEAR、MONTH、DAY、HOUR、MINUTE、SECOND,效果与SUBDATE函数相同,但是不支持DATE_SUB(expr,days)用法。
示例:
SELECT DATE_SUB('2025-01-21', INTERVAL 8 DAY);-- 2025-01-13
SELECT DATE_SUB('2025-01-21', INTERVAL 2 MONTH);-- 2024-11-21
SELECT DATE_SUB('2025-01-21', INTERVAL 1 YEAR);-- 2024-01-21
SELECT DATE_SUB('2025-01-21 12:08:18', INTERVAL 8 DAY);-- 2025-01-13 12:08:18
SELECT DATE_SUB('2025-01-21 12:08:18', INTERVAL 8 HOUR);-- 2025-01-21 04:08:18
SELECT DATE_SUB('2025-01-21 12:08:18', INTERVAL 8 MINUTE);-- 2025-01-21 12:00:18
SELECT DATE_SUB('2025-01-21 12:08:18', INTERVAL 8 SECOND);-- 2025-01-21 12:08:10
SELECT DATE_SUB(NOW(), INTERVAL 8 DAY);-- 2025-01-13 11:14:27
SELECT DATE_SUB(CURDATE(), INTERVAL 8 DAY);-- 2025-01-13
SELECT DATE_SUB('2025-01-21', 8);-- 报错:[Err] 1064
SUBTIME函数
语法:SUBTIME(expr1,expr2),返回日期时间expr1减去一段时间expr2后的日期时间,expr2可以是一个纯数值,也可以是时分秒的格式。
示例:
SELECT SUBTIME('2025-01-21 12:08:18',8);-- 2025-01-21 12:08:10
SELECT SUBTIME('2025-01-21 12:08:18',8.88);-- 2025-01-21 12:08:09.120000
SELECT SUBTIME('2025-01-21 12:08:18','8');-- 2025-01-21 12:08:10
SELECT SUBTIME('2025-01-21 12:08:18','8.88');-- 2025-01-21 12:08:09.120000
SELECT SUBTIME('2025-01-21 12:08:18','12:00:00');-- 2025-01-21 00:08:18
SELECT SUBTIME('2025-01-21 12:08:18','12:00:00.88');-- 2025-01-21 00:08:17.120000
SELECT SUBTIME('2025-01-21 12:08:18','2025-01-21 12:00:00');-- NULL