MySQL 函数篇(3):常用的时间日期函数

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:SSDD 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'
相关推荐
leo_yu_yty2 小时前
Mysql DBA学习笔记(主从复制)
学习·mysql·dba
安审若无2 小时前
解决 sqlplus / as sysdba 登录缓慢问题
运维·服务器·数据库
小哈里3 小时前
【后端开发】golang部分中间件介绍(任务调度/服务治理/数据库/缓存/服务通信/流量治理)
数据库·缓存·中间件·golang·后端开发
m0_619731194 小时前
linux配置数据库
linux·运维·数据库
重启的码农4 小时前
kv数据库-leveldb (16) 跨平台封装-环境 (Env)
数据库
用户6120414922135 小时前
jsp+servlet做的医院挂号看诊管理系统
java·javascript·mysql
COWORKSHOP5 小时前
华为芯片泄密案警示:用Curtain e-locker阻断内部数据泄露
运维·服务器·前端·数据库·安全·华为
青柠编程5 小时前
基于Spring Boot与SSM的中药实验管理系统架构设计
java·开发语言·数据库
塔中妖5 小时前
Spring Boot 启动时将数据库数据预加载到 Redis 缓存
数据库·spring boot·缓存