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
函数有好几个别名:localtime
,localtimestamp
,current_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 |
+-------------------------------------------------------+