MySQL的时间函数用于处理日期和时间数据。以下是一些常用的MySQL时间函数。
内容有点多,建议收藏以备后续用到查阅参考。
目录
[5.1 WEEK() 函数](#5.1 WEEK() 函数)
[5.2 WEEKDAY() 函数](#5.2 WEEKDAY() 函数)
[5.3 WEEKOFYEAR() 函数](#5.3 WEEKOFYEAR() 函数)
[5.4 YEARWEEK() 函数](#5.4 YEARWEEK() 函数)
[6.1 DAY() 函数](#6.1 DAY() 函数)
[6.2 DAYNAME() 函数](#6.2 DAYNAME() 函数)
[6.3 DAYOFMONTH() 函数](#6.3 DAYOFMONTH() 函数)
[6.4 DAYOFWEEK() 函数](#6.4 DAYOFWEEK() 函数)
[6.5 DAYOFYEAR() 函数](#6.5 DAYOFYEAR() 函数)
[6.6 FROM_DAYS() 函数](#6.6 FROM_DAYS() 函数)
[6.7 TO_DAYS() 函数](#6.7 TO_DAYS() 函数)
[6.8 LAST_DAY() 函数](#6.8 LAST_DAY() 函数)
[7.1 DATE() 函数](#7.1 DATE() 函数)
[7.2 DATE_ADD() 函数](#7.2 DATE_ADD() 函数)
[7.3 DATE_FORMAT() 函数](#7.3 DATE_FORMAT() 函数)
[7.4 DATE_SUB() 函数](#7.4 DATE_SUB() 函数)
[7.5 DATEDIFF() 函数](#7.5 DATEDIFF() 函数)
[7.6 ADDDATE() 函数](#7.6 ADDDATE() 函数)
[7.7 MAKEDATE() 函数](#7.7 MAKEDATE() 函数)
[7.8 STR_TO_DATE() 函数](#7.8 STR_TO_DATE() 函数)
[7.9 SUBDATE() 函数](#7.9 SUBDATE() 函数)
[8.1 TIME() 函数](#8.1 TIME() 函数)
[8.2 TIME_FORMAT函数](#8.2 TIME_FORMAT函数)
[8.3 TIME_TO_SEC() 函数](#8.3 TIME_TO_SEC() 函数)
[8.4 TIMEDIFF() 函数](#8.4 TIMEDIFF() 函数)
[8.5 TIMESTAMP() 函数](#8.5 TIMESTAMP() 函数)
[8.6 TIMESTAMPADD() 函数](#8.6 TIMESTAMPADD() 函数)
[8.7 TIMESTAMPDIFF() 函数](#8.7 TIMESTAMPDIFF() 函数)
[8.8 ADDTIME() 函数](#8.8 ADDTIME() 函数)
[8.9 LOCALTIME() 函数](#8.9 LOCALTIME() 函数)
[8.10 LOCALTIMESTAMP() 函数](#8.10 LOCALTIMESTAMP() 函数)
[8.11 MAKETIME() 函数](#8.11 MAKETIME() 函数)
[8.12 SEC_TO_TIME() 函数](#8.12 SEC_TO_TIME() 函数)
[8.13 SUBTIME() 函数](#8.13 SUBTIME() 函数)
[8.14 UNIX_TIMESTAMP() 函数](#8.14 UNIX_TIMESTAMP() 函数)
[9.1 CURDATE() 函数](#9.1 CURDATE() 函数)
[9.2 CURRENT_DATE() 函数](#9.2 CURRENT_DATE() 函数)
[9.3 CURRENT_TIME() 函数](#9.3 CURRENT_TIME() 函数)
[9.4 CURRENT_TIMESTAMP() 函数](#9.4 CURRENT_TIMESTAMP() 函数)
[9.5 CURTIME() 函数](#9.5 CURTIME() 函数)
[10.1 MICROSECOND() 函数](#10.1 MICROSECOND() 函数)
[10.2 SECOND() 函数](#10.2 SECOND() 函数)
[10.3 MINUTE() 函数](#10.3 MINUTE() 函数)
[10.4 HOUR() 函数](#10.4 HOUR() 函数)
[10.5 DAY() 函数](#10.5 DAY() 函数)
[10.6 MONTH() 函数](#10.6 MONTH() 函数)
[10.7 QUARTER() 函数](#10.7 QUARTER() 函数)
[10.8 YEAR() 函数](#10.8 YEAR() 函数)
[10.9 TO_SECONDS() 函数](#10.9 TO_SECONDS() 函数)
[10.10 MONTHNAME() 函数](#10.10 MONTHNAME() 函数)
[10.11 PERIOD_ADD() 函数](#10.11 PERIOD_ADD() 函数)
[10.12 PERIOD_DIFF() 函数](#10.12 PERIOD_DIFF() 函数)
[10.13 CONVERT_TZ() 函数](#10.13 CONVERT_TZ() 函数)
[12.14 UTC函数](#12.14 UTC函数)
一、获取当前日期+时间
语法:
sql
NOW(M)
参数说明:
- M:非必须。保留的微秒位数,最大值为6。
示例:
sql
mysql> SELECT NOW(), NOW()+1, NOW(6), NOW(6)+1;
+---------------------+----------------+---------------------------+-----------------------+
| NOW() | NOW()+1 | NOW(6) | NOW(6)+1 |
+---------------------+-----------------------+--------------------+-----------------------+
| 2023-10-22 10:04:04 | 20231022100405 | 2023-10-22 10:04:04.485897| 20231022100405.485897 |
+---------------------+-----------------------+--------------------+-----------------------+
说明:
NOW()
的结果为YYYY-MM-DD hh:mm:ss
格式。NOW() + 0
的结果为YYYYMMDDhhmmss
格式。NOW() + M
意味着当前时间加上M
秒。+ M
均为当前时间格式上加M
秒。- 除了
NOW()获取当前日期时间外,还有:(语法和使用均与NOW()相似)
- SYSDATE()。
- LOCALTIME。
- LOCALTIME()。
- CURRENT_TIMESTAMP。
- CURRENT_TIMESTAMP()。
二、获取当前日期
sql
mysql> SELECT CURDATE(), CURDATE()+1;
+---------------------+-----------------------+
| CURDATE() | CURDATE()+1 |
+---------------------+-----------------------+
| 2023-10-22 | 20231023 |
+---------------------+-----------------------+
- 无参
说明:
CURDATE()
的结果为YYYY-MM-DD
格式。CURDATE() + 0
的结果为YYYYMMDD
格式。CURDATE() + N
意味着当前日期加上一个数字。- 除了 CURDATE() 能获取当前日期外,还有:(
+ N
意味着当前日期加上一个数字)- CURRENT_DATE。
- CURRENT_DATE()。
三、获取当前时间
语法:
sql
CURTIME(M)
参数说明:
- M:非必须。保留的微秒位数,最大值为6。
示例:
sql
mysql> SELECT CURTIME(), CURTIME() + 1, CURTIME(6), CURTIME(6) + 1;
+---------------------+-----------------------+------------------+
| CURDATE() | CURDATE() + 1 | CURTIME(6) | CURTIME(6) + 1 |
+---------------------+-----------------------+------------------+
| 18:51:58 | 185159 | 18:51:58.994696 | 185159.994696 |
+---------------------+-----------------------+------------------+
说明:
CURTIME()
的结果为hh:mm:ss
格式。CURTIME() + 0
的结果为hhmmss
格式。NOW() + M
意味着当前时间加上M
秒。+ M
均为当前时间格式上加M
秒
注:UTC日期时间与上述日期时间输出格式相同(减8个小时)有
- UTC_DATE、UTC_DATE()
- UTC_TIME、UTC_TIME()
- UTC_TIMESTAMP、UTC_TIMESTAMP()
因为我国位于东八时区,所以本地时间 = UTC 时间 + 8 小时。UTC 时间在业务涉及多个国家和地区的时候,非常有用。
四、日期时间选取函数(Extract函数)
MySQL EXTRACT()
函数从指定的日期/时间中提取指定的部分并返回。
语法:
sql
EXTRACT(unit FROM date)
参数说明:
- date:必需的。一个日期或者日期时间表达式。
- unit:必需的。需要提取的部分的标识。可以是以下值中的一个:
YEAR 年
QUARTER 季
MONTH 月
WEEK 周
DAY 日
HOUR 时
MINUTE 分
SECOND 秒
MICROSECOND 微秒
YEAR_MONTH 年+月
DAY_HOUR 日+时
DAY_MINUTE 日+时+分
DAY_SECOND 日+时+分+秒
DAY_MICROSECOND 日+时+分+秒+微秒
HOUR_MINUTE 时+分
HOUR_SECOND 时+分+秒
HOUR_MICROSECOND 时+分+秒+微秒
MINUTE_SECOND 分+秒
MINUTE_MICROSECOND 分+秒+微秒
SECOND_MICROSECOND 秒+微秒
返回值:
- 从指定的日期/时间中提取指定的部分并返回。
- 返回
NULL情况:
- 指定的表达式不是一个合法的日期或者日期时间。
- 参数为
NULL。
示例:
sql
mysql> set @date = NOW(6);
mysql> SELECT @date;
+---------------------+-----------------------+
| @date |
+---------------------+-----------------------+
| 2023-10-22 18:07:46.304775 |
+---------------------+-----------------------+
SELECT EXTRACT(YEAR FROM @date); -- 2023
SELECT EXTRACT(QUARTER FROM @date); -- 4
SELECT EXTRACT(MONTH FROM @date); -- 10
SELECT EXTRACT(WEEK FROM @date); -- 43
SELECT EXTRACT(DAY FROM @date); -- 22
SELECT EXTRACT(HOUR FROM @date); -- 8
SELECT EXTRACT(MINUTE FROM @date); -- 7
SELECT EXTRACT(SECOND FROM @date); -- 46
SELECT EXTRACT(MICROSECOND FROM @date); -- 304775
SELECT EXTRACT(YEAR_MONTH FROM @date); -- 202310
SELECT EXTRACT(DAY_HOUR FROM @date); -- 2218
SELECT EXTRACT(DAY_MINUTE FROM @date); -- 221807
SELECT EXTRACT(DAY_SECOND FROM @date); -- 22180746
SELECT EXTRACT(DAY_MICROSECOND FROM @date); -- 22180746304775
SELECT EXTRACT(HOUR_MINUTE FROM @date); -- 807
SELECT EXTRACT(HOUR_SECOND FROM @date); -- 80746
SELECT EXTRACT(HOUR_MICROSECOND FROM @date); -- 80746304775
SELECT EXTRACT(MINUTE_SECOND FROM @date); -- 746
SELECT EXTRACT(MINUTE_MICROSECOND FROM @date); -- 746304775
SELECT EXTRACT(SECOND_MICROSECOND FROM @date); -- 46304775
五、WEEK相关函数
5.1 WEEK() 函数
MySQL WEEK()
函数返回给定日期位于当年的第几周。
语法:
sql
WEEK(date)
WEEK(date, mode)
参数说明:
- date:必需的。一个日期或者日期时间表达式。
- mode:可选的。确定计算周的逻辑。如果没有指定该参数,默认将使用 default_week_format 变量的值。
返回值:
- 返回给定日期位于当年的第几周,取值范围为
0
到53
。 - 返回 NULL情况:
- 指定的表达式不是一个合法的日期或者日期时间。
- 参数为
NULL。
mode
参数的处理逻辑如下:
sql
Mode 每周的第一天 返回值范围 对第一周的要求
0 星期天 0-53
1 星期一 0-53 在本年至少 4 天
2 星期天 1-53
3 星期一 1-53 在本年至少 4 天
4 星期天 0-53 在本年至少 4 天
5 星期一 0-53
6 星期天 1-53 在本年至少 4 天
7 星期一 1-53
示例:
sql
SELECT
WEEK('2023-01-01'), -- 1
WEEK('2023-01-01', 0), -- 1
WEEK('2023-01-03', 0), -- 1
WEEK('2023-01-01', 1), -- 0
WEEK('2023-01-03', 1), -- 1
WEEK('2023-01-01', 2), -- 1
WEEK('2023-01-03', 2), -- 1
WEEK('2023-01-01', 3), -- 52
WEEK('2023-01-03', 3), -- 1
WEEK('2023-01-01', 4), -- 1
WEEK('2023-01-03', 4), -- 1
WEEK('2023-01-01', 5), -- 0
WEEK('2023-01-03', 5), -- 1
WEEK('2023-01-01', 6), -- 1
WEEK('2023-01-03', 6), -- 1
WEEK('2023-01-01', 7), -- 52
WEEK('2023-01-03', 7) -- 1
5.2 WEEKDAY() 函数
MySQL WEEKDAY()
函数返回给定日期的工作日编号。
语法:
sql
WEEKDAY(date)
参数说明:
- date: 必需的。一个日期或者日期时间表达式。
返回值:
- 0 :Monday
- 1 :Tuesday
- 2 :Wednesday
- 3 :Thursday
- 4 :Friday
- 5 :Saturday
- 6 :Sunday
- 返回
NULL 情况:
- 指定的表达式不是一个合法的日期或者日期时间。
- 参数为
NULL。
示例:
sql
SELECT
WEEKDAY('2023-10-21'), -- 5
WEEKDAY('2023-10-22'), -- 6
WEEKDAY('2023-10-23'), -- 0
WEEKDAY('2023-10-24'), -- 1
WEEKDAY('2023-10-25'), -- 2
WEEKDAY('2023-10-26'), -- 3
WEEKDAY('2023-10-27') -- 4
- 如果想返回今天的工作日名称,参数用 NOW()、CURDATE(),、CURRENT_DATE() 或 SYSDATE()
5.3 WEEKOFYEAR() 函数
MySQL WEEKOFYEAR()
函数返回给定日期位于当年的第几周。该函数相当于WEEK(date,3)。
语法:
sql
WEEKOFYEAR(date)
参数说明:
- date:必需的。一个日期或者日期时间表达式。
返回值:
- 返回给定日期位于当年的第几周,取值范围为
1
到53。
该函数的前提是"一周的第一天是星期一,并且一年中的第一周有 3 天以上",它相当于 WEEK(date,3)。
- 返回
NULL 情况:
- 指定的表达式不是一个合法的日期或者日期时间。
- 参数为
NULL。
示例:
sql
SELECT WEEKOFYEAR('2023-01-01'), -- 52(2023年第一周只有2天)
WEEKOFYEAR('2023-01-02'), -- 1
WEEKOFYEAR('2023-01-03'), -- 1
WEEKOFYEAR('2024-01-01'), -- 1 (2024年第一周大于3天)
WEEKOFYEAR('2024-01-02'), -- 1
WEEKOFYEAR('2024-01-03'); -- 1
-
如果没有指定
mode
参数,WEEK()
默认将使用default_week_format
变量的值。 -
我们可以通过以下语句查看
default_week_format
变量的值。
*sqlmysql> SHOW VARIABLES LIKE 'default_week_format';; +---------------------+-----------------+ | Variable | Value | +---------------------+-----------------+ | default_week_format | 0 | +---------------------+-----------------+
5.4 YEARWEEK() 函数
MySQL YEARWEEK() 函数返回一个表示给定日期所在年份和第几周的数字。此函数与 WEEK() 类似。
语法:
sql
YEARWEEK(date)
YEARWEEK(date, mode)
参数说明:
- date:必需的。一个日期或者日期时间表达式。
- mode:可选的。确定计算周的逻辑。如果没有指定该参数,默认将使用 default_week_format 变量的值。
返回值:
- 返回一个表示给定日期所在年份和第几周的数字。
- 返回
NULL 情况
- 定的表达式不是一个合法的日期或者日期时间。
- 参数为
NULL。
mode
参数的处理逻辑如下:
sql
Mode 每周的第一天 返回值范围 对第一周的要求
0 星期天 0-53
1 星期一 0-53 在本年至少 4 天
2 星期天 1-53
3 星期一 1-53 在本年至少 4 天
4 星期天 0-53 在本年至少 4 天
5 星期一 0-53
6 星期天 1-53 在本年至少 4 天
7 星期一 1-53
示例:
sql
SELECT
YEARWEEK('2023-01-01'), -- 202301
YEARWEEK('2023-01-01', 0), -- 202301
YEARWEEK('2023-01-03', 0), -- 202301
YEARWEEK('2023-01-01', 1), -- 202252
YEARWEEK('2023-01-03', 1), -- 202301
YEARWEEK('2023-01-01', 2), -- 202301
YEARWEEK('2023-01-03', 2), -- 202301
YEARWEEK('2023-01-01', 3), -- 202252
YEARWEEK('2023-01-03', 3), -- 202301
YEARWEEK('2023-01-01', 4), -- 202301
YEARWEEK('2023-01-03', 4), -- 202301
YEARWEEK('2023-01-01', 5), -- 202252
YEARWEEK('2023-01-03', 5), -- 202301
YEARWEEK('2023-01-01', 6), -- 202301
YEARWEEK('2023-01-03', 6), -- 202301
YEARWEEK('2023-01-01', 7), -- 202352
YEARWEEK('2023-01-03', 7) -- 202301
-
如果没有指定
mode
参数,WEEK()
默认将使用default_week_format
变量的值。 -
我们可以通过以下语句查看
default_week_format
变量的值。
*sqlmysql> SHOW VARIABLES LIKE 'default_week_format';; +---------------------+-----------------+ | Variable | Value | +---------------------+-----------------+ | default_week_format | 0 | +---------------------+-----------------+
六、DAY相关函数
6.1 DAY() 函数
MySQL DAY() 函数返回日期时间表达式中的代表月份中的一天的数字。此函数等同于 DAYOFMONTH() 函数。
语法:
sql
DAY(expr)
参数说明:
- expr:必需的。一个日期或者日期时间表达式。
返回值:
- 返回日期时间表达式中的代表月份中的一天的数字,从 1 到 31。
- 返回
NULL情况:
- 如果指定的表达式不是一个合法的日期或者日期时间。
- 如果参数为
NULL
。
示例:
sql
SELECT
DAY('2023-10-22'), -- 22
DAY('2023-10-22 18:10:10'), -- 22
DAY(NOW()), -- 22
DAY('2023-02-00'), -- 0
DAY('2023-02-30'), -- NULL
DAY('Not A DATE'), -- NULL
DAY(NULL) -- NULL
6.2 DAYNAME() 函数
MySQL DAYNAME()
函数返回给定日期的工作日名称。
语法:
sql
DAYNAME(expr)
参数说明:
- expr:必需的。一个日期或者日期时间表达式。
返回值:
- 返回给定日期的工作日名称,返回值将是以下值中的一个:
Monday
,Tuesday
,Wednesday
,Thursday
,Friday
,Saturday
,Sunday
。 - 返回
NULL情况:
- 指定的表达式不是一个合法的日期或者日期时间。
- 参数为
NULL。
示例:
sql
SELECT
DAYNAME('2023-10-22'), -- Sunday
DAYNAME('2023-10-23'), -- Monday
DAYNAME('2023-10-24'), -- Tuesday
DAYNAME('2023-10-25'), -- Wednesday
DAYNAME('2023-10-26'), -- Thursday
DAYNAME('2023-10-27'), -- Friday
DAYNAME('2023-10-28'), -- Saturday
DAYNAME(NOW()), -- Sunday
DAYNAME('2023-02-00'), -- NULL
DAYNAME('2023-02-30'), -- NULL
DAYNAME('Not A DATE'), -- NULL
DAYNAME(NULL) -- NULL
- 如果想返回今天的工作日名称,参数用 NOW(),、CURDATE(),、CURRENT_DATE() 或 SYSDATE()
6.3 DAYOFMONTH() 函数
MySQL DAYOFMONTH() 函数返回日期时间表达式中的代表月份中的一天的数字。此函数等同于 DAY() 函数。
语法:
sql
DAYOFMONTH(expr)
参数说明:
- expr:必需的。一个日期或者日期时间表达式。
返回值:
- 返回日期时间表达式中的代表月份中的一天的数字,从 1 到 31。
- 如果给定的日期的天的部分为 0 ,比如:
'0000-00-00'
和'2008-00-00'
,DAYOFMONTH()
函数将返回0。
返回 NULL情况:
- 表达式不是一个合法的日期或者日期时间。
- 参数为
NULL
示例:
sql
SELECT
DAYOFMONTH('2023-10-22'), -- 22
DAYOFMONTH('2023-10-22 11:11:11'), -- 22
DAYOFMONTH(NOW()), -- 22
DAYOFMONTH('2023-02-00'), -- 0
DAYOFMONTH('2023-02-30'), -- NULL
DAYOFMONTH('Not A DATE'), -- NULL
DAYOFMONTH(NULL) -- NULL
6.4 DAYOFWEEK() 函数
MySQL DAYOFWEEK()
函数返回给定日期的工作日的索引。
语法:
sql
DAYOFWEEK(expr)
参数说明:
- expr:必需的。一个日期或者日期时间表达式。
返回值:
- 返回一个从
1
到7
之间的数字,代表的含义如下:- 1:星期天
- 2:星期一
- 3:星期二
- 4:星期三
- 5:星期四
- 6:星期五
- 7:星期六
- 返回
NULL情况:
- 指定的表达式不是一个合法的日期或者日期时间。
- 参数为
NULL
示例:
sql
SELECT
DAYOFWEEK('2023-10-21'), -- 7
DAYOFWEEK('2023-10-22'), -- 1
DAYOFWEEK('2023-10-23'), -- 2
DAYOFWEEK('2023-10-24'), -- 3
DAYOFWEEK('2023-10-25'), -- 4
DAYOFWEEK('2023-10-26'), -- 5
DAYOFWEEK('2023-10-27'), -- 6
DAYOFWEEK(NOW()), -- 7
DAYOFWEEK('2023-02-00'), -- NULL
DAYOFWEEK('2023-02-30'), -- NULL
DAYOFWEEK('Not A DATE'), -- NULL
DAYOFWEEK(NULL) -- NULL
6.5 DAYOFYEAR() 函数
MySQL DAYOFYEAR()
函数返回一个从 1
到 366
代表给定日期是一年中的第几天的数字。
语法:
sql
DAYOFYEAR(expr)
参数说明:
- expr:必需的。一个日期或者日期时间表达式。
返回值:
- 返回一个从
1
到366
代表给定日期是一年中的第几天的数字。 - 返回
NULL情况:
- 指定的表达式不是一个合法的日期或者日期时间。
- 参数为
NULL。
示例:
sql
SELECT
DAYOFYEAR('2023-10-21'), -- 294
DAYOFYEAR('2023-10-22'), -- 295
DAYOFYEAR(NOW()), -- 294
DAYOFWEEK('2023-02-00'), -- NULL
DAYOFWEEK('2023-02-30'), -- NULL
DAYOFWEEK('Not A DATE'), -- NULL
DAYOFWEEK(NULL) -- NULL
- 如果想返回今天的工作日名称,参数用 NOW(),、CURDATE(),、CURRENT_DATE() 或 SYSDATE()
6.6 FROM_DAYS() 函数
MySQL FROM_DAYS() 函数将指定的天数转为日期并返回。FROM_DAYS() 函数与 TO_DAYS() 函数是相反的。
语法:
sql
FROM_DAYS(days)
参数说明:
- days:必需的。一个表示天数的整数值。
返回值:
- 返回一个由指定天数表示的日期。
- 返回
NULL情况:
- 参数为
NULL。
- 参数为
示例:
sql
SELECT
FROM_DAYS(739179), -- 2023-10-21
FROM_DAYS(739180); -- 2023-10-22
6.7 TO_DAYS() 函数
MySQL TO_DAYS() 函数将指定日期转为距离 0 年的天数并返回。TO_DAYS() 函数与 FROM_DAYS() 函数是相反的。
语法:
sql
TO_DAYS(date)
参数说明:
- date:必需的。一个日期值。
返回值:
- 返回指定的日期从 0 年开始的天数。
- 返回
NULL情况:
- 参数为
NULL。
- 参数为
示例:
sql
SELECT
TO_DAYS('2023-10-21'), -- 739179
TO_DAYS(now()); -- 739180
6.8 LAST_DAY() 函数
MySQL LAST_DAY()
函数返回指定的日期或者日期时间所在当月的最后一天。
语法:
sql
LAST_DAY(date)
参数说明:
- date:必需的。一个日期或者日期时间表达式。
返回值:
- 返回指定的日期或者日期时间所在当月的最后一天。
- 返回
NULL情况:
- 参数为不合法的日期。
- 参数为
NULL。
示例:
sql
SELECT
LAST_DAY('2019-02-01'), -- 2019-02-28
LAST_DAY('2020-02-01'), -- 2020-02-28
LAST_DAY('2021-02-01'), -- 2021-02-28
LAST_DAY('2022-02-01'), -- 2022-02-28
LAST_DAY('2023-02-01 10:11:12'), -- 2023-02-28
LAST_DAY(NOW()) -- 2023-10-31
七、DATE相关函数
7.1 DATE() 函数
MySQL DATE()
函数从日期时间表达式中提取日期部分并返回。
语法:
sql
DATE(expr)
参数说明:
- expr:必需的。一个日期或者日期时间表达式。
返回值:
- 返回指定的日期或者日期时间表达式中的日期部分。
- 返回
NULL情况:
- 指定的表达式不是一个合法的日期或者日期时间。
- 参数为
NULL。
示例:
sql
SELECT
DATE('2023-10-22'), -- 2023-10-22
DATE('2023-10-22 11:11:11'), -- 2023-10-22
DATE(NOW()), -- 2023-10-22
DATE('2023-02-30'), -- NULL
DATE('Not A Date'), -- NULL
DATE(NULL) -- NULL
7.2 DATE_ADD() 函数
MySQL DATE_ADD()
函数在指定的日期/时间上加上指定到时间间隔加并返回新的日期/时间。
语法:
sql
DATE_ADD(date, INTERVAL value unit)
参数说明:
- date:必需的。需要操作的日期。
- value:必需的。时间/日期间隔。正数和负数都是允许的。
- unit:必需的。时间/日期间隔的单位。单位可以是以下值中的一个:
YEAR 年
QUARTER 季
MONTH 月
WEEK 周
DAY 日
HOUR 时
MINUTE 分
SECOND 秒
MICROSECOND 微秒
YEAR_MONTH
DAY_HOUR
DAY_MINUTE
DAY_SECOND
DAY_MICROSECOND
HOUR_MINUTE
HOUR_SECOND
HOUR_MICROSECOND
MINUTE_SECOND
MINUTE_MICROSECOND
SECOND_MICROSECOND
返回值:
- 返回指定的日期/时间添加指定的时间间隔,并返回一个新的日期/时间。
- 返回值和参数有关:
- 返回
DATE:
如果date
参数是DATE
类型,并且时间间隔为YEAR
,MONTH
或者DAY
。 - 返回
DATETIME:
- 如果
date
参数是DATE
类型,并且时间间隔为HOURS
,MINUTES
或者SECONDS
。 - 如果
date
参数是DATETIME
类型。 - 如果
date
参数是TIME
类型,并且时间间隔为YEAR
,MONTH
或者DAY。
- 如果
- 返回
TIME:
返回TIME。
- 返回
- 其它情况返回字符串。
示例:
sql
SELECT
NOW(6), -- 2023-10-22 12:33:16.021752
DATE_ADD(NOW(6), INTERVAL 5 YEAR), -- 2028-10-22 12:33:16.021752
DATE_ADD(NOW(6), INTERVAL 5 QUARTER), -- 2025-01-22 12:33:16.021752
DATE_ADD(NOW(6), INTERVAL 5 MONTH), -- 2024-03-22 12:33:16.021752
DATE_ADD(NOW(6), INTERVAL 5 WEEK), -- 2023-11-25 12:33:16.021752
DATE_ADD(NOW(6), INTERVAL 5 DAY), -- 2023-10-26 12:33:16.021752
DATE_ADD(NOW(6), INTERVAL 5 HOUR), -- 2023-10-22 17:33:16.021752
DATE_ADD(NOW(6), INTERVAL 5 MINUTE), -- 2023-10-22 12:38:16.021752
DATE_ADD(NOW(6), INTERVAL 5 SECOND), -- 2023-10-22 12:33:21.021752
DATE_ADD(NOW(6), INTERVAL 5 MICROSECOND), -- 2023-10-22 12:33:16.021757
DATE_ADD(NOW(6), INTERVAL 5 YEAR_MONTH), -- 2024-03-22 12:33:16.021752
DATE_ADD(NOW(6), INTERVAL 5 DAY_HOUR), -- 2023-10-22 17:33:16.021752
DATE_ADD(NOW(6), INTERVAL 5 DAY_MINUTE), -- 2023-10-22 12:38:16.021752
DATE_ADD(NOW(6), INTERVAL 5 DAY_SECOND), -- 2023-10-22 12:33:21.021752
DATE_ADD(NOW(6), INTERVAL 5 DAY_MICROSECOND), -- 2023-10-22 12:33:16.521752
DATE_ADD(NOW(6), INTERVAL 5 HOUR_MINUTE), -- 2023-10-22 12:38:16.021752
DATE_ADD(NOW(6), INTERVAL 5 HOUR_SECOND), -- 2023-10-22 12:33:21.021752
DATE_ADD(NOW(6), INTERVAL 5 HOUR_MICROSECOND), -- 2023-10-22 12:33:16.521752
DATE_ADD(NOW(6), INTERVAL 5 MINUTE_SECOND), -- 2023-10-22 12:33:21.021752
DATE_ADD(NOW(6), INTERVAL 5 MINUTE_MICROSECOND),-- 2023-10-22 12:33:16.521752
DATE_ADD(NOW(6), INTERVAL 5 SECOND_MICROSECOND) -- 2023-10-22 12:33:16.521752
- date参数除了
DATE()
还可以用SYSDATE
()、LOCALTIME、LOCALTIME
()、CURRENT_TIMSTAMP
和CURRENT_TIMSTAMP
()
7.3 DATE_FORMAT() 函数
MySQL DATE_FORMAT()
函数按照指定的格式格式化日期时间。
语法:
DATE_FORMAT(date, format)
参数说明:
- date:必需的。需要格式化的日期*。*
- format:必需的。格式化模式字符串*。*
format
中可采用的格式化符号:- %a 星期的缩写 (Sun..Sat)
- %b 月份的缩写 (Jan..Dec)
- %c 月份数字 (0..12)
- %D 带有英语前缀的月份中的每天 (0th, 1st, 2nd, 3rd, ...)
- %d 月份中的每天的两位数字表示 (00..31)
- %e 月份中的每天的数字表示 (0..31)
- %f 微秒 (000000..999999)
- %H 小时 (00..23)
- %h 小时 (01..12)
- %I 小时 (01..12)
- %i 分钟 (00..59)
- %j 一年中的每天 (001..366)
- %k 小时 (0..23)
- %l 小时 (1..12)
- %M 月份名称 (January..December)
- %m 两位数字月份 (00..12)
- %p AM 或者 PM
- %r 十二小时制时间 (hh:mm:ss 后跟 AM 或 PM)
- %S 秒 (00..59)
- %s 秒 (00..59)
- %T 二十四小时制时间 (hh:mm:ss)
- %U 一年中的星期 (00..53), 每周的开始是星期天; WEEK() 函数中的 mode 0
- %u 一年中的星期 (00..53), 每周的开始是星期一; WEEK() 函数中的 mode 1
- %V 一年中的星期 (01..53), 每周的开始是星期天; WEEK() 函数中的 mode 2, 用于 %X
- %v 一年中的星期 (01..53), 每周的开始是星期一; WEEK() 函数中的 mode 3, 用于 %x
- %W 星期的名称 (Sunday..Saturday)
- %w 星期中的每天 (0=星期天..6=星期六)
- %X 一年中的星期,每周的开始是星期天,四位数字,用于 %V
- %x 一年中的星期,每周的开始是星期一,四位数字,用于 %v
- %Y 四位数字年份
- %y 两位数字年份
- %% 转义 %
- %x x, 上面为列举的其他字符
返回值:
- 按照指定的格式格式化日期时间并返回格式化后的字符串。
- 返回
NULL情况:
如果其中任何一个参数为NULL。
示例:
sql
SELECT
DATE_FORMAT('2023-10-24', '%Y'), -- 2023
DATE_FORMAT('2023-10-24', '%W'), -- Tuesday
DATE_FORMAT('2023-02-01', '%M %d, %Y'), -- February 01, 2022
DATE_FORMAT('2023-02-01', '%M %e %Y'), -- February 1 2023
DATE_FORMAT('2023-02-28', '%W, %M %e, %Y'), -- Tuesday, February 28, 2023
DATE_FORMAT(NOW(), '%Y%m%d%H%i%S') -- 20231022181622
7.4 DATE_SUB() 函数
MySQL DATE_SUB()
函数在指定的日期/时间上减去指定到时间间隔加并返回新的日期/时间。
语法:
sql
DATE_SUB(date, INTERVAL value unit)
参数说明:
- date:必需的。需要操作的日期。
- days:必需的。在 date 上减去的天数。
- value:必需的。时间/日期间隔。正数和负数都是允许的。
- unit:必需的。时间/日期间隔的单位。 时间/日期间隔的单位可以是以下值中的一个:
YEAR 年
QUARTER 季
MONTH 月
WEEK 周
DAY 日
HOUR 时
MINUTE 分
SECOND 秒
MICROSECOND 微秒
YEAR_MONTH
DAY_HOUR
DAY_MINUTE
DAY_SECOND
DAY_MICROSECOND
HOUR_MINUTE
HOUR_SECOND
HOUR_MICROSECOND
MINUTE_SECOND
MINUTE_MICROSECOND
SECOND_MICROSECOND
返回值:
- 指定的日期/时间添加指定的时间间隔,并返回一个新的日期/时间。
- 返回值和参数有关:
- 返回
DATE:date
是DATE
类型,且时间间隔为YEAR
,MONTH
或者DAY。
- 返回
TIME:date
是TIME
且计算只涉及HOURS
,MINUTES
和SECONDS
部分。 - 返回
DATETIME:
date
是DATE
类型,并且时间间隔为HOURS
,MINUTES
或者SECONDS。
date
是DATETIME
类型。date
是TIME
类型,并且时间间隔为YEAR
,MONTH
或者DAY
。
- 返回
- 其他情况下返回字符串。
示例:
sql
SELECT
DATE_SUB('2023-10-22', INTERVAL 10 DAY), -- 2023-10-12
DATE_SUB('2023-10-22', INTERVAL 10 HOUR), -- 2023-10-21 14:00:00
DATE_SUB('2023-10-22 14:00:00', INTERVAL 10 HOUR), -- 2023-10-22 04:00:00
DATE_SUB('2023-10-22 14:00:00', INTERVAL 10 MINUTE),-- 2023-10-22 13:50:00
DATE_SUB(CURDATE(), INTERVAL 10 HOUR), -- 2023-10-21 14:00:00
DATE_SUB(NOW(), INTERVAL 10 MINUTE) -- 2023-10-22 14:18:03
7.5 DATEDIFF() 函数
MySQL DATEDIFF()
函数返回两个日期值之间的天数。
语法:
sql
DATEDIFF(date1, date2)
参数说明:
- date1:必需的。一个日期或者日期时间表达式*。*
- date2:必需的。一个日期或者日期时间表达式*。*
返回值:
- 返回两个日期值之间的天数。
- 返回
NULL情况:
- 指定的表达式不是一个合法的日期或者日期时间。
- 参数为
NULL。
示例:
sql
SELECT
DATEDIFF('2023-10-22', '2023-10-28'), -- 06
DATEDIFF('2023-10-22', '2023-10-28 10:10:10'), -- -6
DATEDIFF('2023-10-22 10:10:10', '2023-10-28'), -- -6
DATEDIFF('2023-10-22', '2023-10-27'), -- -5
DATEDIFF('2023-10-22', '2023-10-27 10:10:10'), -- -5
DATEDIFF('2023-10-22 10:10:10', '2023-10-27'), -- -5
DATEDIFF('2023-10-22', '2023-10-28 10:10:10'), -- -6
DATEDIFF('Not A DATEDIFF', 'Not A DATEDIFF'), -- NULL
DATEDIFF(NULL, '2023-10-22'), -- NULL
DATEDIFF(NOW(), '2023-10-18') -- 4
DATEDIFF(NOW(), '2023-10-20'), -- 2
DATEDIFF(CURDATE(), '2023-10-20'), -- 2
DATEDIFF(CURRENT_DATE(), '2023-10-20'), -- 2
DATEDIFF(SYSDATE(), '2023-10-20') -- 2
7.6 ADDDATE() 函数
MySQL ADDDATE()
函数在指定的日期/时间上加上指定到时间间隔加并返回新的日期/时间。
语法:
sql
ADDDATE(date, days)
ADDDATE(date, INTERVAL value unit)
参数说明:
- date:必需的。需要操作的日期。
- days:必需的。在 date 上加上的天数。
- value:必需的。时间/日期间隔。正数和负数都是允许的。
- unit:必需的。时间/日期间隔的单位*。* 时间/日期间隔的单位可以是以下值中的一个:
YEAR 年
QUARTER 季
MONTH 月
WEEK 周
DAY 日
HOUR 时
MINUTE 分
SECOND 秒
MICROSECOND 微秒
YEAR_MONTH
DAY_HOUR
DAY_MINUTE
DAY_SECOND
DAY_MICROSECOND
HOUR_MINUTE
HOUR_SECOND
HOUR_MICROSECOND
MINUTE_SECOND
MINUTE_MICROSECOND
SECOND_MICROSECOND
返回值:
- 返回
DATE情况:date
是DATE
类型,且时间间隔为YEAR
,MONTH
或者DAY。
- 返回
TIME情况:date
是TIME
类型,且计算只涉及HOURS
,MINUTES
和SECONDS
部分。 - 返回
DATETIME情况:
date
参数是DATE
类型,并且时间间隔为HOURS
,MINUTES
或者SECONDS。
date
参数是DATETIME
类型。date
参数是TIME
类型,并且时间间隔为YEAR
,MONTH
或者DAY。
- 其他情况下返回字符串。
示例:
sql
SELECT
ADDDATE('2023-10-22', 10), -- 2023-11-01
ADDDATE('2023-10-22', -10), -- 2023-10-12
ADDDATE('2023-10-22', INTERVAL 10 DAY), -- 2023-11-01
ADDDATE('2023-10-22', INTERVAL 10 HOUR), -- 2023-10-22 10:00:00
ADDDATE('2023-10-22 10:00:00', INTERVAL 10 HOUR), -- 2023-10-22 20:00:00
ADDDATE('2023-10-22 10:00:00', INTERVAL 10 MINUTE), -- 2023-10-22 10:10:00
ADDDATE(CURDATE(), INTERVAL 10 HOUR), -- 2023-10-22 10:00:00
ADDDATE(NOW(), INTERVAL 10 MINUTE) -- 2023-10-22 15:58:07
7.7 MAKEDATE() 函数
MySQL MAKEDATE()
函数根据年份和一年中天数创建一个日期并返回。
语法:
sql
MAKEDATE(year, day_of_year)
参数说明:
- year:必需的。表示年份的 4 位数字。
- day_of_year:必需的。一年中的第几天。应该大于 0。
返回值:
- 根据年份和一年中天数创建一个日期并返回。
- 返回
NULL情况:
day_of_year
等于或小于0。
示例:
sql
SELECT
MAKEDATE(2023, 1), -- 2023-01-01
MAKEDATE(2023, 31), -- 2023-01-31
MAKEDATE(2023, 32), -- 2023-02-01
MAKEDATE(2023, 0) -- NULL
7.8 STR_TO_DATE() 函数
MySQL STR_TO_DATE() 函数将指定的字符串根据指定日期格式转为日期/时间。 STR_TO_DATE() 函数与 DATE_FORMAT() 函数是相反的。
语法:
sql
STR_TO_DATE(str, format)
参数说明:
- str:必需的。需要格式化成日期的字符串。
- format:必需的。格式化字符串。 可采用的格式化符号:
- %a:星期的缩写 (Sun..Sat)
- %b:月份的缩写 (Jan..Dec)
- %c:月份数字 (0..12)
- %D:带有英语前缀的月份中的每天 (0th, 1st, 2nd, 3rd, ...)
- %d:月份中的每天的两位数字表示 (00..31)
- %e:月份中的每天的数字表示 (0..31)
- %f:微秒 (000000..999999)
- %H:小时 (00..23)
- %h:小时 (01..12)
- %I:小时 (01..12)
- %i:分钟 (00..59)
- %j:一年中的每天 (001..366)
- %k:小时 (0..23)
- %l:小时 (1..12)
- %M:月份名称 (January..December)
- %m:两位数字月份 (00..12)
- %p:AM 或者 PM
- %r:十二小时制时间 ( hh:mm:ss 后跟 AM 或 PM)
- %S:秒 (00..59)
- %s:秒 (00..59)
- %T:二十四小时制时间 (hh:mm:ss)
- %U:一年中的星期 (00..53), 每周的开始是星期天; WEEK() 函数中的 mode 0
- %u:一年中的星期 (00..53), 每周的开始是星期一; WEEK() 函数中的 mode 1
- %V:一年中的星期 (01..53), 每周的开始是星期天; WEEK() 函数中的 mode 2, 用于 %X
- %v:一年中的星期 (01..53), 每周的开始是星期一; WEEK() 函数中的 mode 3, 用于 %x
- %W:星期的名称 (Sunday..Saturday)
- %w:星期中的每天 (0=星期天..6=星期六)
- %X:一年中的星期,每周的开始是星期天,四位数字,用于 %V
- %x:一年中的星期,每周的开始是星期一,四位数字,用于 %v
- %Y:四位数字年份
- %y:两位数字年份
- %%:转义 %
- %x:x, 上面为列举的其他字符
返回值:
- 返回一个日期/时间/日期时间。
- 返回
NULL情况:
- 如果不能按照
format
解析str。
- 如果其中任何一个参数为
NULL。
- 如果不能按照
示例:
sql
SELECT
STR_TO_DATE('2023/10/24', '%Y/%m/%d'), -- 2023-10-24
STR_TO_DATE('2023/10/24 10:10:10', '%Y/%m/%d %H:%i:%S'), -- 2023-10-24 10:10:10
STR_TO_DATE('2023/10/24 10:10:10', 'abc'), -- NULL
STR_TO_DATE('2023/10/24 10:10:10', NULL) -- NULL
7.9 SUBDATE() 函数
MySQL SUBDATE()
函数在指定的日期/时间上减去指定到时间间隔加并返回新的日期/时间。
语法:
sql
SUBDATE(date, days)
SUBDATE(date, INTERVAL value unit)
参数说明:
- date:必需的。需要操作的日期。
- days:必需的。在 date 上减去的天数。
- value:必需的。时间/日期间隔。正数和负数都是允许的。
- unit:必需的。时间/日期间隔的单位。时间/日期间隔的单位可以是以下值中的一个:
YEAR 年
QUARTER 季
MONTH 月
WEEK 周
DAY 日
HOUR 时
MINUTE 分
SECOND 秒
MICROSECOND 微秒
YEAR_MONTH
DAY_HOUR
DAY_MINUTE
DAY_SECOND
DAY_MICROSECOND
HOUR_MINUTE
HOUR_SECOND
HOUR_MICROSECOND
MINUTE_SECOND
MINUTE_MICROSECOND
SECOND_MICROSECOND
返回值:
- 从指定的日期/时间减去指定的时间间隔,并返回一个新的日期/时间。
- 返回
DATE情况:date
是DATE
类型,且时间间隔为YEAR
,MONTH
或者DAY。
- 返回
TIME情况:date
是TIME
类型,且计算只涉及HOURS
,MINUTES
和SECONDS
部分。 - 返回
DATETIME情况:
date
是DATE
类型,且时间间隔为HOURS
,MINUTES
或者SECONDS。
- 如果
date
是DATETIME
类型。 date
是TIME
类型,且时间间隔为YEAR
,MONTH
或者DAY。
- 其他情况下返回字符串。
示例:
sql
SELECT
SUBDATE('2023-10-24', 10), -- 2023-10-14
SUBDATE('2023-10-24', -10), -- 2023-11-03
SUBDATE('2023-10-24', INTERVAL 10 DAY), -- 2023-10-14
SUBDATE('2023-10-24', INTERVAL 10 HOUR), -- 2023-10-23 14:00:00
SUBDATE('2023-10-24 10:24:00', INTERVAL 10 HOUR), -- 2023-10-24 00:24:00
SUBDATE('2023-10-24 10:24:00', INTERVAL 10 MINUTE), -- 2023-10-24 10:14:00
SUBDATE(CURDATE(), INTERVAL 10 HOUR), -- 2023-10-21 14:00:00
SUBDATE(NOW(), INTERVAL 10 MINUTE) -- 2023-10-22 09:29:34
八、TIME相关函数
8.1 TIME() 函数
语法:
sql
TIME(expr)
参数说明:
- expr:必需的。一个日期或者日期时间表达式。
返回值:
- 返回指定的时间或者日期时间中的时间部分。
- 返回
NULL情况:
- 指定的表达式不是一个合法的时间或者日期时间。
- 参数为
NULL。
示例:
sql
SELECT
TIME('11:11:11'), -- 11:11:11
TIME('2023-02-28 11:11:11'), -- 11:11:11
TIME('11:11:11.001112'), -- 11:11:11
TIME('2023-02-28 11:11:11'), -- 11:11:11
TIME(NOW()), -- 18:19:05
TIME('Not A Date'), -- 00:00:00
TIME(NULL) -- null
8.2 TIME_FORMAT函数
MySQL TIME_FORMAT()
函数按照指定的格式格式化时间。
语法:
sql
TIME_FORMAT(time, format)
参数说明:
- time:必需的。需要格式化的日期。
- format:必需的。格式化模式字符串。可采用的格式化符号:
- %f:微秒 (000000..999999)
- %H:小时 (00..23)
- %h:小时 (01..12)
- %I:小时 (01..12)
- %i:分钟 (00..59)
- %k:小时 (0..23)
- %l:小时 (1..12)
- %p:AM 或者 PM
- %r:十二小时制时间 (hh:mm:ss 后跟 AM 或 PM)
- %S:秒 (00..59)
- %s:秒 (00..59)
- %T:二十四小时制时间 (hh:mm:ss)
- %%:转义 %
返回值:
- 按照指定的格式格式化时间并返回格式化后的字符串。
- 返回
NULL情况:
任何一个参数为NULL。
示例:
sql
SELECT
TIME_FORMAT("14:30:10", "%H %i %s"), -- 14 30 10
TIME_FORMAT("14:30:10", "%h %i %s %p"), -- 02 30 10 PM
TIME_FORMAT("14:30:10", "%r"), -- 02:30:10 PM
TIME_FORMAT("14:30:10", "%T"), -- 14:30:10
TIME_FORMAT("14:30:10", "%H %i %s") -- 14 30 10
8.3 TIME_TO_SEC() 函数
MySQL TIME_TO_SEC()
函数将指定的时间值转为秒数。
语法:
sql
TIME_TO_SEC(time)
参数说明:
- time:必需的。时间。格式:HH:MM:SS 或者 HH:MM 或者 SS。
返回值:
- 将指定的时间值转为秒数。
- 返回
NULL情况:
参数为NULL。
示例:
sql
SELECT
TIME_TO_SEC('14:14:10') `14:14:10`, -- 51250
TIME_TO_SEC('14:14') `14:14`, -- 51240
TIME_TO_SEC('14') `14`; -- 14
8.4 TIMEDIFF() 函数
MySQL TIMEDIFF()
函数返回两个时间之间的差值。
语法:
sql
TIMEDIFF(time1, time2)
参数说明:
- time1:必需的。一个时间或者日期时间表达式。
- time2:必需的。另一个时间或者日期时间表达式。
返回值:
- 返回两个时间之间的差值,它返回一个
HH:MM:SS
格式的时间值。 - 返回
NULL情况:
- 指定的表达式不是一个合法的时间或者日期时间。
- 参数为
NULL。
示例:
sql
SELECT
TIMEDIFF('14:14:14', '14:10:10'), -- 00:04:04
TIMEDIFF('14:14:14', '10:10:10'), -- 04:04:04
TIMEDIFF('2023-10-28 12:12:12', '2023-10-21 10:10:10'), -- 170:02:02
TIMEDIFF(NOW(), '2023-10-28 10:10:10') -- -139:18:40
8.5TIMESTAMP() 函数
MySQL TIMESTAMP()
函数累加所有参数并将结果作为日期时间值返回。
语法:
sql
TIMESTAMP(date_or_datetime)
TIMESTAMP(date_or_datetime, time)
参数说明:
- date_or_datetime:必需的。一个日期或者日期时间表达式。格式: YYYY-MM-DD 或者 YYYY-MM-DD HH:MM:SS。
- time:可选的。一个时间值。格式:HH:MM:SS。
返回值:
date_or_datetime
作为日期时间值返回。date_or_datetime
与time
的和作为日期时间值返回。- 返回
NULL情况:
任何一个参数为NULL。
示例:
sql
SELECT TIMESTAMP('2023-10-22'), -- 2023-10-22 00:00:00
TIMESTAMP('2023-10-22', '10:10:10'), -- 2023-10-22 10:10:10
TIMESTAMP('2023-10-22 12:00:00', '12:00:00') -- 2023-10-23 00:00:00
8.6 TIMESTAMPADD() 函数
MySQL TIMESTAMPADD()
函数将指定的时间间隔加到一个日期时间值上并返回结果。
语法:
sql
TIMESTAMPADD(unit, interval, datetime)
参数说明:
- unit:必需的。时间间隔的单位,可用值有: MICROSECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR.
- interval:可选的。一个表示时间间隔的整数值。
- datetime:可选的。一个 datetime 值或表达式*。*
返回值:
- 将指定的时间间隔
interval
加到一个日期时间值上并返回结果。 - 返回
NULL情况:
任何一个参数为NULL。
示例:
sql
SELECT
TIMESTAMPADD(WEEK, 1, '2023-10-22'), -- 2023-10-29
TIMESTAMPADD(DAY, 7, '2023-10-22'), -- 2023-10-29
TIMESTAMPADD(SECOND, 10, '2023-10-22'); -- 2023-10-22 00:00:10
8.7 TIMESTAMPDIFF() 函数
MySQL TIMESTAMPDIFF()
函数返回两个日期时间之间的时间间隔。
语法:
sql
TIMESTAMPDIFF(unit, datetime1, datetime2)
参数说明:
- unit:必需的。时间间隔的单位,可用值有: MICROSECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR。
- datetime1:必需的。一个 datetime 值或表达式。
- datetime2:必需的。一个 datetime 值或表达式。
返回值:
- 返回两个日期/日期时间之间的时间间隔。
- 返回
NULL情况:
任何一个参数为NULL。
示例:
sql
SELECT
TIMESTAMPDIFF(YEAR, '2022-1-28', '2023-10-22'), -- 1
TIMESTAMPDIFF(MONTH, '2022-02-28', '2023-10-22'),-- 19
TIMESTAMPDIFF(MONTH, '2023-02-28', '2023-10-22') -- 7
8.8 ADDTIME() 函数
MySQL ADDTIME()
函数在指定的时间上加上指定的时间间隔并返回结果。
语法:
sql
ADDTIME(timeExpr1, timeExpr2)
参数说明:
- timeExpr1:必需的。它是一个 datetime 或者 time 表达式。
- timeExpr2:必需的。它是个时间表达式。它可以是正数或者负数。
返回值:
- 将
timeExpr2
加到timeExpr1
上,并返回结果。 - 按如下规则确定返回值的类型:
- 若
timeExpr1
参数是动态类型,ADDTIME()
函数返回值类型为TIME
。 否则,ADDTIME()
函数返回的数据类型和第一个参数一样。
- 若
示例:
sql
SELECT
ADDTIME('2023-10-10 10:10:10', 10), -- 2023-10-10 10:10:20
ADDTIME('14:10:10', 10), -- 14:10:20
ADDTIME('14:10:10', 100), -- 14:11:10
ADDTIME('14:10:10', '100'), -- 14:11:10
ADDTIME('14:10:10', '0:01:00'), -- 14:11:10
ADDTIME('14:00:00', '01:10:10.000010'), -- 15:10:10.000010
ADDTIME('14:00:00', '-01:10:10.000010'), -- 12:49:49.999990
SUBTIME('14:00:00', '01:10:10.000010') -- 12:49:49.999990
8.9 LOCALTIME() 函数
MySQL LOCALTIME() 函数按 YYYY-MM-DD hh:mm:ss 格式返回当前时间和日期。
LOCALTIME() 函数与 NOW() 函数完全相同。
语法:
sql
LOCALTIME
LOCALTIME()
返回值:
- 当前时间和日期。
示例:
sql
SELECT
LOCALTIME, -- 2023-10-22 08:20:38
LOCALTIME + 1, -- 20231022082039
LOCALTIME(), -- 2023-10-22 08:20:38
LOCALTIME() + 1; -- 20231022082039
8.10 LOCALTIMESTAMP() 函数
MySQL LOCALTIMESTAMP() 函数按 YYYY-MM-DD hh:mm:ss 格式返回当前时间和日期。
LOCALTIMESTAMP() 函数与 NOW() 函数完全相同。
语法:
sql
LOCALTIMESTAMP
LOCALTIMESTAMP()
返回值:
- 当前时间和日期。
示例:
sql
SELECT
LOCALTIMESTAMP, -- 2023-10-22 08:23:48
LOCALTIMESTAMP + 1, -- 20231022082349
LOCALTIMESTAMP(), -- 2023-10-22 08:23:48
LOCALTIMESTAMP() + 1 -- 20231022082349
8.11 MAKETIME() 函数
MySQL MAKETIME()
函数指定的时、分、秒创建一个时间并返回。
语法:
sql
MAKETIME(hour, minute, second)
参数说明:
- hour:必需的。小时。
- minute:必需的。分钟,取值范围从 0 到 59。
- second:必需的。秒,取值范围从 0 到 59。
返回值:
- 指定的时、分、秒创建一个时间并返回。
- 返回
NULL情况:
如果minute
不在0
到59
之间。- 如果
second
不在0
到59
之间
- MySQL 支持的时间的范围是从
-838:59:59
到838:59:59
。
示例:
sql
SELECT
MAKETIME(10, 11, 12), -- 10:11:12
MAKETIME(100, 11, 12), -- 100:11:12
MAKETIME(839, 11, 12), -- 838:59:59
MAKETIME(-999, 11, 12), -- -838:59:59
MAKETIME(10, 11, 12), -- 10:11:12
MAKETIME(10, 60, 12), -- NULL
MAKETIME(10, 11, 75) -- NULL
8.12 SEC_TO_TIME() 函数
MySQL SEC_TO_TIME()
函数将指定的秒数转为一个格式为 HH:MM:SS
的时间值。
语法:
sql
SEC_TO_TIME(seconds)
参数说明:
- *seconds:*必需的。秒数。
返回值:
- 返回一个格式为
HH:MM:SS
的时间值。 - 返回
NULL情况:
参数为NULL。
示例:
sql
SELECT
SEC_TO_TIME(100), -- 00:01:40
SEC_TO_TIME(3600), -- 01:00:00
SEC_TO_TIME(-72000); -- -20:00:00
8.13 SUBTIME() 函数
MySQL SUBTIME()
函数在指定的时间上减去指定的时间间隔并返回结果。
语法:
sql
SUBTIME(timeExpr1, timeExpr2)
参数说明:
- timeExpr1:必需的。它是一个 datetime 或者 time 表达式。
- timeExpr2:必需的。它是个时间表达式。它可以是正数或者负数。
返回值:
- 从
timeExpr1
中减去timeExpr2
,并返回结果。 - 按如下规则确定返回值的类型:
- 若
timeExpr1
参数是动态类型,SUBTIME()
函数返回值类型为TIME
。 - 否则,
SUBTIME()
函数返回的数据类型和第一个参数一样。
- 若
示例:
sql
SELECT
SUBTIME('2023-12-24 10:10:24', 10), -- 2023-12-24 10:10:14
SUBTIME('10:10:24', 10), -- 10:10:14
SUBTIME('10:10:24', 100), -- 10:09:24
SUBTIME('10:10:24', '100'), -- 10:09:24
SUBTIME('10:10:24', '0:01:00'), -- 10:09:24
SUBTIME('10:00:24', '01:10:10.000010'), -- 08:50:13.999990
SUBTIME('10:00:24', '-01:10:10.000010'), -- 11:10:34.000010
ADDTIME('10:00:24', '01:10:10.000010') -- 11:10:34.000010
8.14 UNIX_TIMESTAMP() 函数
MySQL UNIX_TIMESTAMP()
函数将指定的日期/日期时间转为 UNIX 时间戳值。 UNIX 时间戳值是距离 UTC 时间 1970-01-01 00:00:00
的秒数。
语法:
sql
UNIX_TIMESTAMP()
UNIX_TIMESTAMP(date_or_datetime)
参数说明:
- date_or_datetime: 可选的。默认值为
NOW()
。
返回值:
- 将指定的日期/日期时间转为距离 UTC 时间
1970-01-01 00:00:00
的秒数。 - 返回
NULL情况:
参数为NULL。
示例:
sql
SELECT
UNIX_TIMESTAMP(), -- 1697968385
UNIX_TIMESTAMP(NOW()), -- 1697968385
UNIX_TIMESTAMP(NULL) -- NULL
九、CUR相关函数
9.1 CURDATE() 函数
MySQL CURDATE() 函数按 YYYY-MM-DD 或 YYYYMMDD 格式返回系统的当前日期。
CURDATE() 函数与 CURRENT_DATE() 函数完全相同。
语法:
sql
CURDATE()
返回值:
- 当前日期。
示例:
sql
SELECT
CURDATE(), -- 2023-10-22
CURDATE() + 0, -- 20231022
CURDATE() + 1; -- 20231023
-
- N 表示把日期转为 yyyyMMdd 格式 + N。
9.2 CURRENT_DATE() 函数
MySQL CURRENT_DATE() 函数按 YYYY-MM-DD 或 YYYYMMDD 格式返回系统的当前日期。
CURDATE() 函数与 CURRENT_DATE() 函数完全相同。
语法:
sql
CURRENT_DATE
CURRENT_DATE()
返回值:
- 当前日期。
示例:
sql
SELECT
CURRENT_DATE, -- 2023-10-22
CURRENT_DATE + 1, -- 20231023
CURRENT_DATE(), -- 2023-10-22
CURRENT_DATE() + 0, -- 20231022
CURRENT_DATE() + 1; -- 20231023
-
- N 表示把日期转为 yyyyMMdd 格式 + N。
9.3 CURRENT_TIME() 函数
MySQL CURRENT_TIME() 函数按 hh:mm:ss 格式返回系统的当前时间。
CURRENT_TIME() 函数与 CURTIME() 函数完全相同。
语法:
sql
CURRENT_TIME
CURRENT_TIME()
返回值:
- 当前时间。
示例:
sql
SELECT
CURRENT_TIME, -- 15:28:58
CURRENT_TIME + 1, -- 152859
CURRENT_TIME(), -- 15:28:58
CURRENT_TIME() + 0, -- 152858
CURRENT_TIME() + 1 -- 152859
-
- N 表示把时间转为 hhmmss 格式 + N。
9.4 CURRENT_TIMESTAMP() 函数
MySQL CURRENT_TIMESTAMP() 函数按 YYYY-MM-DD hh:mm:ss 格式返回当前时间和日期。
CURRENT_TIMESTAMP() 函数与 NOW() 函数完全相同。
语法:
sql
CURRENT_TIMESTAMP
CURRENT_TIMESTAMP()
返回值:
- 当前时间和日。
示例:
sql
SELECT
CURRENT_TIMESTAMP, -- 2023-10-22 15:32:40
CURRENT_TIMESTAMP + 1, -- 20231022153241
CURRENT_TIMESTAMP(), -- 2023-10-22 15:32:40
CURRENT_TIMESTAMP() + 0, -- 20231022153240
CURRENT_TIMESTAMP() + 1; -- 20231022153241
-
- N 表示把日期时间转为 yyyyMMddhhmmss 格式 + N。
9.5 CURTIME() 函数
MySQL CURTIME() 函数按 hh:mm:ss 格式返回系统的当前时间。
CURTIME() 函数与 CURRENT_TIME() 函数完全相同。
语法:
sql
CURTIME()
返回值:
- 当前时间。
示例:
sql
SELECT
CURTIME(), -- 15:39:13
CURTIME() + 0, -- 153913
CURTIME() + 1 -- 153914
-
- N 表示把日期时间转为 hhmmss 格式 + N。
十、其它日期时间函数
10.1 MICROSECOND() 函数
MySQL MICROSECOND()
函数提取时间或日期时间中的微秒部分部分并作为数字返回。
语法:
sql
MICROSECOND(time)
参数说明:
- time:必需的。一个日期或者日期时间表达式。
返回值:
- 提取时间或日期时间中的微秒部分部分并作为数字返回。
- 值是介于
0
到999999
之间的数字。
- 值是介于
- 返回
NULL情况:
参数为NULL。
示例:
sql
SELECT
MICROSECOND('10:11:12.000334'), -- 334
MICROSECOND('2023-10-24 10:11:12.000334'), -- 334
MICROSECOND('2023-10-24') -- 0
10.2 SECOND() 函数
MySQL SECOND()
函数提取并返回时间的秒部分。
语法:
sql
SECOND(time)
参数说明:
- *time:*必需的。一个时间或者日期时间表达式。
返回值:
- 返回时间的秒部分,
SECOND()
函数的返回值介于0
到59
之间。 - 返回 NULL情况:参数为
NULL。
示例:
sql
SELECT
SECOND('10:11:12'), -- 12
SECOND('2023-10-24 10:11:12') -- 12
10.3 MINUTE() 函数
MySQL MINUTE()
函数提取并返回时间的分钟部分。
语法:
sql
MINUTE(time)
参数说明:
- time:必需的。一个时间或者日期时间表达式。
返回值:
- 返回值介于
0
到59
之间。 - 返回
NULL情况:
参数为NULL。
示例:
sql
SELECT
MINUTE('14:11:12'), -- 11
MINUTE('2023-10-24 14:11:12') -- 11
10.4 HOUR() 函数
MySQL HOUR()
函数提取并返回时间的小时部分。
语法:
sql
HOUR(time)
参数说明:
- time:必需的。一个时间或者日期时间表达式。
返回值:
- 指定的时间或者日期时间中的小时部分并作为数字返回。
- MySQL 支持的最大时间为
838:59:59
,HOUR()
函数的最大返回值是838。
- 返回
0:
如果time
中没有小时部分。 - 返回
NULL:
参数为NULL。
示例:
sql
SELECT
HOUR('10:10:10'), -- 10
HOUR('2023-10-24 10:10:10'), -- 10
HOUR('123:10:10'), -- 123
HOUR('1234:10:10'), -- 838 MySQL 支持的最大时间是 838:59:59
HOUR('2023-10-24'), -- 0 不正确的时间格式
HOUR('2023-10-31'), -- 0 不正确的时间格式
HOUR('Not A DATE'), -- 0 不正确的时间格式
HOUR(NULL) -- NULL
10.5 DAY() 函数
MySQL DAY() 函数返回日期时间表达式中的代表月份中的一天的数字。此函数等同于 DAYOFMONTH() 函数。
语法:
sql
DAY(expr)
参数说明:
- expr:必需的。一个日期或者日期时间表达式。
返回值:
- 返回日期时间表达式中的代表月份中的一天的数字,从 1 到 31。
- 返回
NULL情况:
- 如果指定的表达式不是一个合法的日期或者日期时间。
- 如果参数为
NULL
。
示例:
sql
SELECT
DAY('2023-10-21'), -- 21
DAY('2023-10-21 09:10:10'), -- 21
DAY(NOW()), -- 21
DAY('2023-02-00'), -- 0
DAY('2023-02-30'), -- NULL
DAY('Not A DATE'), -- NULL
DAY(NULL) -- NULL
10.6 MONTH() 函数
MySQL MONTH()
函数提取日期的月份部分并作为数字返回。
语法:
sql
MONTH(date)
参数说明:
- date:必需的。一个日期或者日期时间表达式。
返回值:
- 返回值介于
1
到12
之间。 - 返回
NULL情况:
参数为NULL。
示例:
sql
SELECT
MONTH('2023-10-24'), -- 10
MONTH('2023-10-24 14:11:12') -- 10
10.7 QUARTER() 函数
MySQL QUARTER()
函数返回一个指定日期所在季度值。
语法:
sql
QUARTER(date)
参数说明:
- date:必需的。一个日期或者日期时间表达式。
返回值:
- 返回一个指定日期所在季度值。返回值介于
1
到4
之间:1:
第一季度,即 1 月到 3 月。2:
第二季度,即 4 月到 6 月。3:
第三季度,即 7 月到 9 月。4:
第四季度,即 10 月到 12 月。
- 返回
NULL:参数为
NULL。
示例:
sql
SELECT
QUARTER('2023-10-24'), -- 4
QUARTER('2023-10-24 10:11:12') -- 4
10.8 YEAR() 函数
MySQL YEAR()
函数提取日期的年份部分并作为数字返回。
语法:
sql
YEAR(date)
参数说明:
- time:必需的。一个日期或者日期时间表达式。
返回值:
- 返回作为日期的年份部分的数字。返回值是
0
或者介于1000
到9999
之间的数字。 - 返回
NULL情况:
参数为NULL。
示例:
sql
SELECT
YEAR('2023-10-24'), -- 2023
YEAR('2023-10-24 10:11:12'), -- 2023
YEAR('0000-01-01'), -- 0
YEAR('abc') -- NULL
10.9 TO_SECONDS() 函数
MySQL TO_SECONDS()
函数将指定的日期/日期时间转为距离 0 年的秒数并返回结果。
语法:
sql
TO_SECONDS(date_or_datetime)
参数说明:
- date_or_datetime:必需的。一个表示天数的整数值。
返回值:
- 返回指定的日期/日期时间从 0 年开始的秒数。
- 返回
NULL情况:
- 参数为
NULL。
- 参数为
示例:
sql
SELECT
TO_SECONDS('2023-10-24'), -- 63865324800
TO_SECONDS('2023-10-24 10:10:14') -- 63865361414
10.10 MONTHNAME() 函数
MySQL MONTHNAME()
函数返回给定日期的月份的名字。
语法:
sql
MONTHNAME(date)
参数说明:
- date:必需的。一个日期或者日期时间表达式。
返回值:
- 返回给定日期的月份的名字。返回值以下值中的一个:
January。
February。
March。
April。
May。
June。
July。
August。
September。
October。
November。
December
。
- 返回
NULL情况:
指定的表达式不是一个合法的日期或者日期时间。- 参数为
NULL。
示例:
sql
SELECT
MONTHNAME('2023-10-01'), -- October
MONTHNAME('2023-11-01'), -- November
MONTHNAME('2023-12-01'), -- December
MONTHNAME('2024-01-01'), -- January
MONTHNAME('2024-02-01'), -- February
MONTHNAME('2024-03-01'), -- March
MONTHNAME('2024-04-01'), -- April
MONTHNAME('2024-05-01'), -- May
MONTHNAME('2024-06-01'), -- June
MONTHNAME('2024-07-01'), -- July
MONTHNAME('2024-08-01'), -- August
MONTHNAME('2024-09-01'), -- September
MONTHNAME('Not A DATE'), -- NULL
MONTHNAME(NULL) -- NULL
10.11 PERIOD_ADD() 函数
MySQL PERIOD_ADD()
函数在指定年月上加上指定的月数将结果作为年月返回。
语法:
sql
PERIOD_ADD(period, month_number)
参数说明:
- period:必需的。使用 YYYYMM 或 YYMM 格式表示的时期。
- month_number:必需的。需要加到 period 上的月数*。*
返回值:
- 指定年月上加上指定的月数将结果作为年月。(格式是
YYYYMM)
- 返回
NULL情况:
参数为NULL。
示例:
sql
SELECT
PERIOD_ADD(202301, 1), -- 202302
PERIOD_ADD(202301, 2), -- 202303
PERIOD_ADD(202301, 3), -- 202304
PERIOD_ADD(202301, 4), -- 202305
PERIOD_ADD(202301, 5), -- 202306
PERIOD_ADD(202301, 6), -- 202307
PERIOD_ADD(202301, 7), -- 202308
PERIOD_ADD(202301, 8), -- 202309
PERIOD_ADD(202301, 9), -- 202310
PERIOD_ADD(202301, 10), -- 202311
PERIOD_ADD(202301, 11), -- 202312
PERIOD_ADD(202301, 12) -- 202401
10.12 PERIOD_DIFF() 函数
MySQL PERIOD_DIFF()
函数返回两个通过年月指定的时期之间相差的月数。
语法:
sql
PERIOD_DIFF(period1, period2)
参数说明:
- period1:必需的。格式: YYYYMM 或 YYMM。
- period2:必需的。格式: YYYYMM 或 YYMM。
返回值:
- 返回两个通过年月指定的时期之间相差的月数。
示例:
sql
SELECT
PERIOD_DIFF(202302, 202301), -- 1
PERIOD_DIFF(202303, 202301), -- 2
PERIOD_DIFF(202304, 202301), -- 3
PERIOD_DIFF(202305, 202301), -- 4
PERIOD_DIFF(202306, 202301), -- 5
PERIOD_DIFF(202307, 202301), -- 6
PERIOD_DIFF(202308, 202301), -- 7
PERIOD_DIFF(202309, 202301), -- 8
PERIOD_DIFF(202310, 202301), -- 9
PERIOD_DIFF(202311, 202301), -- 10
PERIOD_DIFF(202312, 202301), -- 11
PERIOD_DIFF(202301, 202301) -- 0
10.13 CONVERT_TZ() 函数
MySQL CONVERT_TZ()
函数将一个时区的时间转为另一个时区的时间并返回。
语法:
sql
CONVERT_TZ(datetime, fromTimeZone, toTimeZone)
参数说明:
- datetime:必需的。需要处理的日期时间。
- fromTimeZone:必需的。当前时区的标识。
- toTimeZone:必需的。新的时区的标识。
- fromTimeZone 和 toTimeZone 支持的格式包括:
- 使用 SYSTEM 意味着和当前系统的时区一样。
- 使用
+/-[H]H:MM
是和 UTC 时间的偏移量,如'+10:00'
,'-6:00'
,'+05:00'等。
- 使用时区的名称,比如:
'Europe/Helsinki'
,'US/Eastern'
,'MET'
,'GMT'
。
返回值:
- 返回新时区的日期时间。
- 参数错误或者为
NULL
,CONVERT_TZ()
函数将返回NULL
示例:
sql
SELECT
CONVERT_TZ('2023-10-22 14:00:00', 'GMT', 'MET'), -- 2023-10-22 16:00:00
CONVERT_TZ('2023-10-22 14:00:00', 'GMT', '+01:00'), -- 2023-10-22 15:00:00
CONVERT_TZ('2023-10-22 14:00:00', 'GMT', '-01:00'), -- 2023-10-22 13:00:00
CONVERT_TZ('2023-10-22 14:00:00', 'GMT', '-03:00') -- 2023-10-22 11:00:00
12.14 UTC函数
UTC函数有:
-
UTC_DATE、UTC_DATE() 函数:与DATE函数相似(UTC_DATE少8个小时)详见 7.1
-
UTC_TIME、UTC_TIME() 函数:与TIME函数相似(UTC_DATE少8个小时)详见 8.1
-
UTC_TIMESTAMP、UTC_TIMESTAMP() 函数:与TIMESTAMP函数相似(UTC_DATE少8个小时)详见 8.5