在数据库中,日期和时间是经常需要处理的数据类型之一。SQL提供了许多内置的日期函数,用于对日期和时间进行操作、计算和比较。这些函数可以帮助我们提取日期的各个部分(如年份、月份、日、小时、分钟等),执行日期的转换和格式化,以及计算日期之间的差值。
目录
获取当前时间
CURRENT_TIMESTAMP() / NOW()
CURRENT_DATE() / CURDATE()
CURRENT_TIME() / CURTIME()
提取时间
DATE()
TIME()
提取各部分时间的函数
EXTRACT()
格式化日期
DATE_FORMAT()
增/减时间
DATE_ADD() / DATE_SUB()
ADDTIME() / SUBTIME()
TIMESTAMPADD()
计算日期差
DATEDIFF()
TIMESTAMPDIFF()
可以使用 NOW() 、 CURDATE()、CURTIME() 获取当前时间或 CURRENT_TIMESTAMP()、CURRENT_DATE()、CURRENT_TIME() ,这两组函数在对应功能上相同,但在具体应用和某些特性上存在一定差异。
返回当前日期和时间。格式:YYYY-MM-DD hh:mm:ss
mysql> SELECT NOW() AS `current_datetime`;
+-------------------------+
| current_datetime |
+-------------------------+
| 2025-03-31 15:31:49.091 |
+-------------------------+
返回日期,不包括时间。格式:YYYY-MM-DD
mysql> SELECT CURDATE() AS `current_date`;
+--------------+
| current_date |
+--------------+
| 2025-03-25 |
+--------------+
返回当前时间,不包括日期。格式:hh:mm:ss
mysql> SELECT CURTIME() AS `current_time`;
+--------------+
| current_time |
+--------------+
| 16:16:30 |
+--------------+
在使用 NOW()
和 CURTIME()
时,如果要精确的秒以后的时间的话,可以在()中加数字,加多少,就表示精确到秒后多少位
比如 NOW(3)
就是精确到毫秒,表示为: 2025-03-31 15:27:20.645
返回日期/时间值的日期部分。
示例:
mysql> SELECT DATE('2025-11-14 16:48:23') AS `date`;
+------------+
| date |
+------------+
| 2025-11-14 |
+------------+
返回日期/时间值的时间部分。
示例:
mysql> SELECT TIME('2025-11-14 16:48:23') AS `time`;
+----------+
| time |
+----------+
| 16:48:23 |
+----------+
函数 | 作用 |
---|---|
YEAR() | 返回一个日期/时间值的年份 |
MONTH() | 返回一个日期/时间值的月份 |
DAY() | 返回一个日期/时间值的日 |
HOUR() | 返回一个日期/时间值的小时 |
MINUTE() | 返回一个日期/时间值的分钟 |
SECOND() | 返回一个日期/时间值的秒数 |
示例:
mysql> SELECT YEAR('2025-11-14 16:48:23') AS `year`;
+------+
| year |
+------+
| 2025 |
+------+
EXTRACT() 函数用于返回日期/时间的单独部分,如 YEAR
(年)、MONTH
(月)、DAY
(日)、HOUR
(小时)、MINUTE
(分钟)、 SECOND
(秒)。
语法
EXTRACT(unit FROM date)
其中:
- table 是表格名
- date 参数是合法的日期表达式。
- unit 参数是需要返回的时间部分,如
YEAR
、MONTH
、DAY
、HOUR
、MINUTE
、SECOND
等。
示例:
mysql> SELECT EXTRACT(MONTH FROM '2025-11-14 16:45:41') AS `month`;
+-------+
| month |
+-------+
| 11 |
+-------+
在一般情况下,
EXTRACT(unit FROM date)
与unit()
的结果相同。
该函数用于将日期或时间值按照指定的格式进行格式化。
语法
DATE_FORMAT(date,format);
其中:
date
是要格式化的日期或时间值。format
是指定的格式字符串。
格式字符串:
年份 | |
---|---|
%Y | 表示四位数的年份。 |
%y | 表示两位数的年份,如2023为23。 |
月份 | |
%M | 表示英文形式的月份,如11月为November。 |
%m | 表示数字形式的月份。 |
日期 | |
%D | 表示英文形式的日期,如1st、14th等。 |
%d | 表示数字形式的日期。 |
小时 | |
%H | 表示24小时制的小时。 |
%h / %I | 表示12小时制的小时,如16为04。 |
分钟 | |
%i | 表示分钟。 |
秒钟 | |
%S / %s | 表示秒数。(MySQL里%S / %s是具有相同含义的) |
星期 | |
%W | 表示星期的英文全称,如星期二为Tuesday。 |
%w | 表示星期的数字形式,如星期日为0,星期一为1,以此类推。 |
%a | 表示星期的英文缩写,如星期二为Tue。 |
示例:
mysql> SELECT DATE_FORMAT('2025-11-14 19:23:13', '%Y %m') AS `date_format`
+-------------+
| date_format |
+-------------+
| 2025 11 |
+-------------+
DATE_ADD用于向日期或时间添加指定的时间间隔,DATE_SUB用于从日期或时间减去指定的时间间隔。
语法
DATE_ADD/DATE_SUB(date, INTERVAL value unit)
其中,
date
是要操作的日期或时间;value
是要添加(减去)的时间值;unit
是时间单位,可以是DAY、MONTH、YEAR等,也可以是HOUR、MINUTE、SECOND等。
示例:
向日期添加1天
mysql> SELECT DATE_ADD('2025-11-14 19:33:13', INTERVAL 1 DAY) AS `date_add`
+---------------------+
| date_add |
+---------------------+
| 2025-11-15 19:33:13 |
+---------------------+
ADDDATE()与DATE_ADD()功能相同,SUBDATE()与DATE_SUB()功能相同,但它们在某些数据库中可能不支持。
ADDTIME()用于向时间添加指定的时间间隔,SUBTIME()用于从时间减去指定的时间间隔。
语法
ADDTIME/SUBTIME(time, 'value unit')
其中,
time
是要操作的时间;value
是要添加(减去)的时间值;unit
是时间单位,可以是HOUR、MINUTE、SECOND等。
示例:
mysql> SELECT DATE_ADD('2025-11-14 19:33:13', '1 hour') AS `subtime`
+---------------------+
| subtime |
+---------------------+
| 2025-11-14 18:33:13 |
+---------------------+
用于向时间戳添加指定的时间间隔。
语法
TIMESTAMPADD(unit, value, timestamp)
其中,
unit
:表示要添加的时间单位,如 DAY、MONTH、YEAR 等。value
:表示要添加的时间值,可以是整数或小数。timestamp
:表示要操作的时间戳。
示例:
向日期减去3天
mysql> SELECT TIMESTAMPDAA('2025-11-14 19:33:13', DAY, -3) AS `timestampadd`
+---------------------+
| timestampadd |
+---------------------+
| 2025-11-11 18:33:13 |
+---------------------+
计算两个日期之间的天数差。
语法
DATEDIFF(end_date, start_date)
其中,
start_date
:表示起始日期。end_date
:表示结束日期。
计算两个日期或时间戳之间的差值。
TIMESTAMPDIFF(unit, start_time, end_time)
其中,
unit
是时间单位,可以是DAY、MONTH、YEAR等;start_date
:表示起始日期。end_date
:表示结束日期。
示例:
mysql> SELECT TIMESTAMPDIFF(MONTH, '2025-08-14', '2025-11-14') AS `timestampdiff`
+---------------+
| timestampdiff |
+---------------+
| 3 |
+---------------+
# 结束日小于起始日时
-> SELECT TIMESTAMPDIFF(MONTH, '2025-08-15', '2025-11-14') AS `timestampdiff`
+---------------+
| timestampdiff |
+---------------+
| 2 |
+---------------+