MySQL
提供了丰富的日期和时间函数,用于处理日期 、时间 以及日期时间 数据,下面我将 MySQL
的日期函数分为几个大类,并且介绍其常用的用法。
一、获取当前日期和时间的函数
函数名称 | 返回格式 | 说明 |
---|---|---|
NOW() |
YYYY-MM-DD HH:MM:SS |
返回当前日期和时间 |
SYSDATE() |
YYYY-MM-DD HH:MM:SS |
返回当前系统日期和时间 |
CURDATE() |
YYYY-MM-DD |
返回当前日期 |
CURTIME() |
HH:MM:SS |
返回当前时间 |
1.1 NOW() 与 SYSDATE()
NOW()
vs SYSDATE()
的区别:
NOW()
返回语句开始执行的时间。在一个语句中多次调用 NOW(),返回值是相同的。SYSDATE()
返回函数被调用时的实际时间。在一个语句中多次调用 SYSDATE(),返回值可能不同。
sql
SELECT NOW(), SLEEP(2), NOW();
-- 两个 NOW() 返回相同的时间
-- 结果: 2025-09-28 09:33:04 0 2025-09-28 09:33:04
SELECT SYSDATE(), SLEEP(2), SYSDATE();
-- 两个 SYSDATE() 返回的时间相差约2秒
-- 结果: '2023-10-27 14:30:17', ... , '2023-10-27 14:30:19'
1.2 CURDATE() 与 CURTIME()
sql
SELECT CURDATE(),CURTIME()
-- 2025-09-28 09:35:44
二、日期时间部分提取函数
这部分没什么好说的,看下面表格就行
函数名 | 描述 | 示例 | 结果 |
---|---|---|---|
YEAR(date) |
提取年份 | YEAR('2023-10-27') |
2023 |
MONTH(date) |
提取月份 (1-12) | MONTH('2023-10-27') |
10 |
DAY(date) / DAYOFMONTH(date) |
提取日期 (1-31) | DAY('2023-10-27') |
27 |
HOUR(time) |
提取小时 | HOUR('14:30:15') |
14 |
MINUTE(time) |
提取分钟 | MINUTE('14:30:15') |
30 |
SECOND(time) |
提取秒 | SECOND('14:30:15') |
15 |
MICROSECOND(expr) |
提取微秒 | MICROSECOND('14:30:15.123456') |
123456 |
QUARTER(date) |
提取季度 (1-4) | QUARTER('2023-10-27') |
4 |
WEEK(date[, mode]) |
提取一年中的第几周 | WEEK('2023-10-27') |
43 |
DAYOFWEEK(date) |
返回星期索引 (1=周日, 7=周六) | DAYOFWEEK('2023-10-27') |
6 (周五) |
DAYOFYEAR(date) |
返回一年中的第几天 (1-366) | DAYOFYEAR('2023-10-27') |
300 |
WEEKDAY(date) |
返回星期索引 (0=周一, 6=周日) | WEEKDAY('2023-10-27') |
4 (周五) |
DAYNAME(date) |
返回星期的英文名 | DAYNAME('2023-10-27') |
Friday |
MONTHNAME(date) |
返回月份的英文名 | MONTHNAME('2023-10-27') |
October |
EXTRACT(unit FROM date) |
按指定单位提取部分(更符合SQL标准) | EXTRACT(YEAR_MONTH FROM '2023-10-27') |
202310 |
三、日期时间格式转换函数
函数名称 | 返回格式 | 说明 |
---|---|---|
DATE_FORMAT(date, format) |
根据指定格式返回日期字符串 | 将日期转换为指定的字符串格式 |
TIME_FORMAT(time, format) |
根据指定格式返回时间字符串 | 将时间转换为指定的字符串格式 |
STR_TO_DATE(str, format) |
YYYY-MM-DD HH:MM:SS 或其他格式 |
将字符串转换为日期时间格式 |
3.1 DATE_FORMAT:将日期转换为指定的字符串格式
在 MySQL
中,DATE_FORMAT()
函数用于将日期或时间值格式化为指定的字符串格式。这个函数非常有用,尤其是在需要将日期时间值以特定格式显示或存储时。DATE_FORMAT()
函数的基本语法如下:
DATE_FORMAT(date, format)
- date:要格式化的日期或时间值,可以是 DATE、DATETIME 或 TIMESTAMP 类型。
- format:指定的格式字符串,用于定义输出的日期时间格式。
以下是一些常用的格式化符号及其含义:
符号 | 描述 |
---|---|
%a |
缩写的星期名(如 Mon、Tue 等) |
%b |
缩写的月份名(如 Jan、Feb 等) |
%c |
月份(01 到 12) |
%D |
带有英文前缀的日期(如 1st、2nd 等) |
%d |
日期(00 到 31) |
%e |
日期(0 到 31) |
%f |
微秒(000000 到 999999) |
%H |
小时(24 小时制,00 到 23) |
%h |
小时(12 小时制,01 到 12) |
%I |
小时(12 小时制,01 到 12) |
%i |
分钟(00 到 59) |
%j |
一年中的第几天(001 到 366) |
%k |
小时(24 小时制,0 到 23) |
%l |
小时(12 小时制,1 到 12) |
%M |
月份名(如 January、February 等) |
%m |
月份(01 到 12) |
%p |
上午或下午(AM 或 PM) |
%r |
12 小时制的时间(如 08:00:00 PM) |
%S |
秒(00 到 59) |
%s |
秒(00 到 59) |
%T |
24 小时制的时间(如 20:00:00) |
%u |
一年中的第几周(00 到 53,星期一作为一周的开始) |
%U |
一年中的第几周(00 到 53,星期日作为一周的开始) |
%v |
一年中的第几周(01 到 53,星期一作为一周的开始) |
%V |
一年中的第几周(01 到 53,星期日作为一周的开始) |
%W |
星期名(如 Sunday、Monday 等) |
%w |
一周中的第几天(0 代表星期日,1 代表星期一,以此类推) |
%X |
一年中的第几周的年份(星期一作为一周的开始) |
%x |
一年中的第几周的年份(星期日作为一周的开始) |
%Y |
年份(4 位数字,如 2023) |
%y |
年份(2 位数字,如 23) |
sql
SELECT NOW(), DATE_FORMAT(NOW(), '%Y-%m-%d') AS formatted_date;
-- 2025-09-28 09:52:20 2025-09-28
SELECT DATE_FORMAT(NOW(), '%a, %b %d, %Y') AS formatted_date;
-- Sun, Sep 28, 2025
SELECT DATE_FORMAT(NOW(), '%j') AS day_of_year;
-- 271
3.2 TIME_FORMAT:将时间转换为指定的字符串格式
只能转换时间 时分秒 不能转化日期
,但是其格式化符号及其含义同DATE_FORMAT
。
sql
SELECT TIME_FORMAT(NOW(),'%H:%i:%s')AS time;
-- 10:08:18
3.3 STR_TO_DATE:将字符串转换为日期时间格式
将字符串按照指定格式解析为日期时间值。是 DATE_FORMAT()
的逆操作。
sql
SELECT STR_TO_DATE('27/10/2023', '%d/%m/%Y') AS date_value;
-- 结果: '2023-10-27'
SELECT STR_TO_DATE('2023-10-27 14:30:15', '%Y-%m-%d %H:%i:%s') AS datetime_value;
-- 结果: '2023-10-27 14:30:15'
四、日期时间计算函数
函数名 | 描述 | 示例 | 结果 |
---|---|---|---|
DATE_ADD(date, INTERVAL expr type) |
在日期上加上指定的时间间隔 | DATE_ADD('2023-10-27', INTERVAL 10 DAY) |
2023-11-06 |
DATE_SUB(date, INTERVAL expr type) |
从日期中减去指定的时间间隔 | DATE_SUB('2023-10-27', INTERVAL 10 DAY) |
2023-10-17 |
ADDDATE(date, INTERVAL expr type) |
在日期上加上指定的时间间隔(同 DATE_ADD ) |
ADDDATE('2023-10-27', INTERVAL 10 DAY) |
2023-11-06 |
SUBDATE(date, INTERVAL expr type) |
从日期中减去指定的时间间隔(同 DATE_SUB ) |
SUBDATE('2023-10-27', INTERVAL 10 DAY) |
2023-10-17 |
4.1 DATE_ADD 与 ADDDATE
在日期上加上指定的时间间隔
单位 | 描述 |
---|---|
MICROSECOND |
微秒 |
SECOND |
秒 |
MINUTE |
分钟 |
HOUR |
小时 |
DAY |
天 |
WEEK |
周 |
MONTH |
月 |
QUARTER |
季度 |
YEAR |
年 |
SECOND_MICROSECOND |
秒和微秒 |
MINUTE_MICROSECOND |
分钟和微秒 |
MINUTE_SECOND |
分钟和秒 |
HOUR_MICROSECOND |
小时和微秒 |
HOUR_SECOND |
小时和秒 |
HOUR_MINUTE |
小时和分钟 |
DAY_MICROSECOND |
天和微秒 |
DAY_SECOND |
天和秒 |
DAY_MINUTE |
天和分钟 |
DAY_HOUR |
天和小时 |
YEAR_MONTH |
年和月 |
sql
-- 加一天
SELECT DATE_ADD('2025-10-27', INTERVAL 1 DAY) AS new_date;
-- 结果: '2025-10-28'
-- 加 1 小时 30 分钟
SELECT DATE_ADD('2025-10-27 14:30:00', INTERVAL '1:30' HOUR_MINUTE) AS new_datetime;
-- 结果: '2025-10-27 16:00:00'
4.2 DATE_SUB 与 SUBDATE
sql
-- 减一个月
SELECT DATE_SUB('2023-10-27', INTERVAL 1 MONTH) AS new_date;
-- 结果: '2023-09-27'
五、日期时间差异计算函数
函数名 | 描述 | 示例 | 结果 |
---|---|---|---|
DATEDIFF(expr1, expr2) |
返回两个日期之间相差的天数 (expr1 - expr2) | DATEDIFF('2023-10-28', '2023-10-27') |
1 |
TIMEDIFF(expr1, expr2) |
返回两个时间之间相差的时间 (expr1 - expr2) | TIMEDIFF('15:00:00', '14:30:00') |
00:30:00 |
TIMESTAMPDIFF(unit, datetime1, datetime2) |
返回两个日期时间之间的整数差,单位由 unit 指定 (datetime2 - datetime1) | TIMESTAMPDIFF(MONTH, '2023-01-15', '2023-10-27') |
9 |
PERIOD_DIFF(P1, P2) |
返回两个时期(格式 YYYYMM 或 YYMM)之间的月数差 (P1 - P2) | PERIOD_DIFF(202310, 202301) |
9 |
5.1 DATEDIFF
在MySQL中,DATEDIFF 是一个日期函数,用于计算两个日期之间的差距,并以指定的时间单位返回结果。
DATEDIFF(end_date, start_date)
end_date :表示要计算的时间段的结束日期。
start_date:表示要计算的时间段的开始日期。
返回值:DATEDIFF() 函数返回两个日期之间的天数差,结果是一个整数。如果 end_date早于 start_date,返回值为负数;如果 end_date晚于 start_date,返回值为正数;如果两个日期相同,返回值为 0。
sql
SELECT DATEDIFF('2025-10-01', '2025-09-01') AS days_difference;
-- 30
SELECT DATEDIFF('2023-09-01', '2023-10-01') AS days_difference;
-- -30
SELECT DATEDIFF(CURDATE(), '2025-01-01') AS days_difference;
-- 270
时间部分的忽略:
DATEDIFF() 函数只计算日期部分的差异,忽略时间部分。即使两个日期时间值的时间部分不同,只要日期部分相同,返回值仍然是 0。
日期格式:
确保输入的日期格式正确,否则会报错。MySQL 支持多种日期格式,但最常用的是 YYYY-MM-DD。
NULL 值:
如果 expr1 或 expr2 为 NULL,则 DATEDIFF() 函数返回 NULL。
5.2 TIMEDIFF
在 MySQL
中,TIMEDIFF()
函数用于计算两个时间值或两个日期时间值之间的差异。这个函数返回的结果是一个时间值,表示两个时间之间的差值,格式为 HH:MM:SS
或 DD HH:MM:SS
(如果差值超过24小时)。
TIMEDIFF(expr1, expr2)
expr1
:结束时间或日期时间值,可以是 TIME、DATETIME 或 TIMESTAMP 类型。
expr2
:开始时间或日期时间值,可以是 TIME、DATETIME 或 TIMESTAMP 类型。
返回值
:TIMEDIFF() 函数返回两个时间或日期时间值之间的差值,结果是一个 TIME 类型的值。如果 expr1 早于 expr2,返回值为负时间值;如果 expr1 晚于 expr2,返回值为正时间值;如果两个时间相同,返回值为 00:00:00。
sql
SELECT TIMEDIFF('14:30:45', '08:15:20') AS time_difference;
-- 06:15:25
SELECT TIMEDIFF('08:15:20', '14:30:45') AS time_difference;
-- -06:15:25
SELECT TIMEDIFF('2025-10-01 14:30:45', '2025-09-30 08:15:20') AS time_difference;
-- 1:06:15:25
5.3 TIMESTAMPDIFF
在 MySQL
中,TIMESTAMPDIFF()
函数用于计算两个日期或时间之间的差异,单位可以是年、月、日、小时、分钟或秒等。这个函数非常灵活,可以用于各种时间单位的计算。
TIMESTAMPDIFF(unit, expr1, expr2)
unit:指定返回值的时间单位,可以是以下之一:
- SECOND:秒
- MINUTE:分钟
- HOUR:小时
- DAY:天
- MONTH:月
- QUARTER:季度
- YEAR:年
expr1 :开始日期或时间值,可以是 DATE、DATETIME 或 TIMESTAMP 类型。
expr2 :结束日期或时间值,可以是 DATE、DATETIME 或 TIMESTAMP 类型。
返回值:TIMESTAMPDIFF() 函数返回两个日期或时间值之间的差异,单位由 unit 参数指定。如果 expr1 早于 expr2,返回值为正数;如果 expr1 晚于 expr2,返回值为负数;如果两个日期或时间相同,返回值为 0。
sql
SELECT TIMESTAMPDIFF(DAY, '2025-09-01', '2025-10-01') AS days_difference;
-- 30
SELECT TIMESTAMPDIFF(MONTH, '2025-01-01', '2025-10-01') AS months_difference;
-- 9
SELECT TIMESTAMPDIFF(HOUR, '2025-10-01 08:15:20', '2025-10-01 14:30:45') AS hours_difference;
-- 6
时间单位的大小写:
unit 参数的值是区分大小写的,必须使用大写。例如,SECOND、MINUTE、HOUR 等。
日期和时间格式:
确保输入的日期和时间格式正确,否则会报错。MySQL 支持多种日期和时间格式,但最常用的是 YYYY-MM-DD 和 YYYY-MM-DD HH:MM:SS。
NULL 值:
如果 expr1 或 expr2 为 NULL,则 TIMESTAMPDIFF() 函数返回 NULL。
跨年和跨月的计算:
当计算跨年或跨月的差异时,TIMESTAMPDIFF() 函数会自动处理这些情况。例如,计算 2023-01-01 和 2024-01-01 之间的月数差时,结果为 12。
六、其他函数
不过多介绍,使用较少,看一下就能懂
函数名 | 描述 | 示例 |
---|---|---|
LAST_DAY(date) |
返回给定日期所在月份的最后一天。 | SELECT LAST_DAY('2023-02-15'); -- '2023-02-28' |
MAKEDATE(year, dayofyear) |
根据年份和一年中的天数创建一个日期。 | SELECT MAKEDATE(2023, 300); -- '2023-10-27' |
MAKETIME(hour, minute, second) |
根据时、分、秒创建一个时间。 | SELECT MAKETIME(14, 30, 15); -- '14:30:15' |
DATE(date) |
提取日期时间的日期部分。 | SELECT DATE('2023-10-27 14:30:15'); -- '2023-10-27' |
TIME(expr) |
提取日期时间的时间部分。 | SELECT TIME('2023-10-27 14:30:15'); -- '14:30:15' |