zzxworld

常用的 MySQL 日期和时间函数(含使用示例)

常用的 MySQL 日期和时间函数(含使用示例)

MySQL 提供了大量跟日期和时间相关的内部函数,要把这些函数一个个都记在脑子里并不容易。花时间整理了一份 MySQL 数据库常用日期函数的介绍和使用例子,以方便日后使用。

curdate

获取当前日期,仅包含年月日信息。

mysql> select curdate();
+------------+
| curdate()  |
+------------+
| 2022-10-25 |
+------------+

此函数有一个别名:current_date

curtime

获取当前时间,仅包含时分秒信息。

mysql> SELECT curtime();
+-----------+
| curtime() |
+-----------+
| 09:05:03  |
+-----------+

此函数有一个别名:current_time

now

获取当前日期和时间,包含年月日和时分秒信息。

mysql> SELECT now();
+---------------------+
| now()               |
+---------------------+
| 2022-10-25 09:10:05 |
+---------------------+

now 函数有好几个别名:localtimelocaltimestampcurrent_timestamp,它们返回的结果是一样的。

sleep

以秒为单位暂停语句的执行。比如暂停 3 秒 :

mysql> SELECT sleep(3);
+----------+
| sleep(3) |
+----------+
|        0 |
+----------+

sysdate

获取当前时间。它与上面的函数存在一些区别。上面的函数返回的是 SQL 执行时的时间,而 sysdate 函数是动态获取调用时的时间。关于这点可以参考下面的执行示例:

mysql> SELECT now(), sleep(3), sysdate(), now();
+---------------------+----------+---------------------+---------------------+
| now()               | sleep(3) | sysdate()           | now()               |
+---------------------+----------+---------------------+---------------------+
| 2022-10-25 09:14:17 |        0 | 2022-10-25 09:14:20 | 2022-10-25 09:14:17 |
+---------------------+----------+---------------------+---------------------+

可以看到,sysdate 函数获取的时间比 now 函数获取的时间晚 3 秒。

date_format

格式化指定的时间。使用它可以任意指定要返回的日期和时间格式。比如只显示当前时间的年月日:

mysql> SELECT date_format('2022-01-01', '%Y年%m月%d日');
+-----------------------------------+
| date_format(now(), '%Y年%m月%d日') |
+-----------------------------------+
| 2022年01月01日                     |
+-----------------------------------+

str_to_date

把非标准的时间字符串统一为常用的格式。

mysql> SELECT str_to_date('01.01.2022', '%m.%d.%Y');
+---------------------------------------+
| str_to_date('01.01.2022', '%m.%d.%Y') |
+---------------------------------------+
| 2022-01-01                            |
+---------------------------------------+

to_days

返回从 0000-00-00 开始,到指定时间的天数。

mysql> SELECT to_days('1000-01-01');
+-----------------------+
| to_days('1000-01-01') |
+-----------------------+
|                365243 |
+-----------------------+

from_days

根据指定的天数, 0000-00-00 开始计算并返回相应的日期。

mysql> SELECT from_days(365243);
+-------------------+
| from_days(365243) |
+-------------------+
| 1000-01-01        |
+-------------------+

extract

从时间中提取指定的信息。此函数的使用格式如下:

extract(UNIT FROM 时间);

时间可以为指定的字符串,也可以是获取时间的函数。比如 now()UNIT 是要提取时间的单位名称。可用名称见下表:

UNIT 名称 说明
YEAR 年份
MONTH 月份
DAY
HOUR 小时
MINUTE 分钟
SECOND
WEEK 星期
MICROSECOND 微秒
QUARTER 季度
SECOND_MICROSECOND 秒至微秒之间的信息
MINUTE_MICROSECOND 分钟至微秒之间的信息
MINUTE_SECOND 分钟至秒之间的信息
HOUR_MICROSECOND 小时至微秒之间的信息
HOUR_SECOND 小时至秒之间的信息
HOUR_MINUTE 小时至分钟之间的信息
DAY_MICROSECOND 日至微秒之间的信息
DAY_SECOND 日至秒之间的信息
DAY_MINUTE 日至分钟之间的信息
DAY_HOUR 日至小时之间的信息
YEAR_MONTH 年至月之间的信息

假如要从 2022-10-01 中提取年份信息,就可以这样来使用:

mysql> SELECT extract(YEAR FROM '2022-10-01');
+---------------------------------+
| extract(YEAR FROM '2022-10-01') |
+---------------------------------+
|                            2022 |
+---------------------------------+

date_add

增加指定单位的时间并返回结果。比如在当前时间上增加一天:

mysql> SELECT date_add(now(), INTERVAL 1 DAY);
+---------------------------------+
| date_add(now(), INTERVAL 1 DAY) |
+---------------------------------+
| 2022-10-26 09:30:41             |
+---------------------------------+

上面的 INTERVAL 1 DAY 是函数特定的语法格式,其中的 1 设置要增加的时间间距大小。后面的 DAY 是时间单位。它有如下可以使用的值:

单位名称 说明
YEAR 以年为单位
MONTH 以月为单位
DAY 以日为单位
HOUR 以小时为单位
MINUTE 以分为单位
SECOND 以秒为单位

date_sub

减少指定单位的时间并返回结果。使用格式和上面的 date_add 类似,不过结果相反。比如在当前时间上减一天:

mysql> SELECT date_sub(now(), INTERVAL 1 DAY);
+---------------------------------+
| date_sub(now(), INTERVAL 1 DAY) |
+---------------------------------+
| 2022-10-24 09:41:57             |
+---------------------------------+

datediff

对比两个日期的差异,返回按天的差值。

mysql> SELECT datediff('2022-10-01', '2022-10-10');
+--------------------------------------+
| datediff('2022-10-01', '2022-10-10') |
+--------------------------------------+
|                                   -9 |
+--------------------------------------+

timediff

对比两个时间的差异,返回时分秒格式的差值。

mysql> SELECT timediff('2022-10-01 12:00:00', '2022-10-02 12:00:30');
+--------------------------------------------------------+
| timediff('2022-10-01 12:00:00', '2022-10-02 12:00:30') |
+--------------------------------------------------------+
| -24:00:30                                              |
+--------------------------------------------------------+

convert_tz

转换指定时间的时区并输出转换后的结果。

mysql> SELECT convert_tz('2022-10-01 12:00:00', '+08:00', '+00:00');
+-------------------------------------------------------+
| convert_tz('2022-10-01 12:00:00', '+08:00', '+00:00') |
+-------------------------------------------------------+
| 2022-10-01 04:00:00                                   |
+-------------------------------------------------------+