文档主页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  函数和运算符  /  日期和时间函数

14.7 日期和时间函数

本节介绍可用于处理时间值的函数。有关每种日期和时间类型的取值范围以及可以指定值的有效格式的说明,请参阅第 13.2 节“日期和时间数据类型”

表 14.11 日期和时间函数

名称 说明
ADDDATE() 将时间值(间隔)添加到日期值
ADDTIME() 添加时间
CONVERT_TZ() 从一个时区转换为另一个时区
CURDATE() 返回当前日期
CURRENT_DATE(), CURRENT_DATE CURDATE() 的同义词
CURRENT_TIME(), CURRENT_TIME CURTIME() 的同义词
CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP NOW() 的同义词
CURTIME() 返回当前时间
DATE() 提取日期或日期时间表达式的日期部分
DATE_ADD() 将时间值(间隔)添加到日期值
DATE_FORMAT() 按指定格式格式化日期
DATE_SUB() 从日期中减去时间值(间隔)
DATEDIFF() 减去两个日期
DAY() DAYOFMONTH() 的同义词
DAYNAME() 返回工作日的名称
DAYOFMONTH() 返回月份中的某一天 (0-31)
DAYOFWEEK() 返回参数的星期几索引
DAYOFYEAR() 返回一年中的某一天 (1-366)
EXTRACT() 提取日期的一部分
FROM_DAYS() 将天数转换为日期
FROM_UNIXTIME() 将 Unix 时间戳格式化为日期
GET_FORMAT() 返回日期格式字符串
HOUR() 提取小时数
LAST_DAY 返回参数所在月份的最后一天
LOCALTIME(), LOCALTIME NOW() 的同义词
LOCALTIMESTAMP, LOCALTIMESTAMP() NOW() 的同义词
MAKEDATE() 根据年份和一年中的某一天创建日期
MAKETIME() 根据小时、分钟、秒创建时间
MICROSECOND() 返回参数的微秒数
MINUTE() 返回参数的分钟数
MONTH() 返回传递的日期的月份
MONTHNAME() 返回月份的名称
NOW() 返回当前日期和时间
PERIOD_ADD() 将周期添加到年-月
PERIOD_DIFF() 返回周期之间的月数
QUARTER() 返回日期参数的季度
SEC_TO_TIME() 将秒转换为“hh:mm:ss”格式
SECOND() 返回秒数 (0-59)
STR_TO_DATE() 将字符串转换为日期
SUBDATE() 使用三个参数调用时,它是 DATE_SUB() 的同义词
SUBTIME() 减去时间
SYSDATE() 返回函数执行的时间
TIME() 提取传递的表达式的時間部分
TIME_FORMAT() 格式化为时间
TIME_TO_SEC() 返回转换为秒的参数
TIMEDIFF() 减去时间
TIMESTAMP() 使用一个参数时,此函数返回日期或日期时间表达式;使用两个参数时,返回参数的总和
TIMESTAMPADD() 将间隔添加到日期时间表达式
TIMESTAMPDIFF() 使用指定的单位返回两个日期时间表达式的差
TO_DAYS() 返回转换为天数的日期参数
TO_SECONDS() 返回转换为自 0 年以来的秒数的日期或日期时间参数
UNIX_TIMESTAMP() 返回 Unix 时间戳
UTC_DATE() 返回当前 UTC 日期
UTC_TIME() 返回当前 UTC 时间
UTC_TIMESTAMP() 返回当前 UTC 日期和时间
WEEK() 返回周数
WEEKDAY() 返回星期几索引
WEEKOFYEAR() 返回日期的日历周 (1-53)
YEAR() 返回年份
YEARWEEK() 返回年份和周数

以下是一个使用日期函数的示例。以下查询选择 date_col 值在过去 30 天内的所有行

mysql> SELECT something FROM tbl_name
    -> WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= date_col;

该查询还选择日期在未来的行。

期望使用日期值的函数通常接受日期时间值并忽略时间部分。期望使用时间值的函数通常接受日期时间值并忽略日期部分。

返回当前日期或时间的函数在每次查询开始执行时只计算一次。这意味着在单个查询中多次引用诸如 NOW() 之类的函数总是产生相同的结果。(出于我们的目的,单个查询还包括对存储程序(存储例程、触发器或事件)的调用以及该程序调用的所有子程序。)此原则也适用于 CURDATE()CURTIME()UTC_DATE()UTC_TIME()UTC_TIMESTAMP() 以及它们的任何同义词。

CURRENT_TIMESTAMP()CURRENT_TIME()CURRENT_DATE()FROM_UNIXTIME() 函数返回当前会话时区中的值,该时区可作为 time_zone 系统变量的会话值使用。此外,UNIX_TIMESTAMP() 假定其参数是会话时区中的日期时间值。请参阅第 7.1.15 节 “MySQL 服务器时区支持”

某些日期函数可以与“日期或不完整日期(例如 '2001-11-00')一起使用,而其他函数则不能。提取日期部分的函数通常适用于不完整日期,因此当您可能预期非零值时,它们可能会返回 0。例如

mysql> SELECT DAYOFMONTH('2001-11-00'), MONTH('2005-00-00');
        -> 0, 0

其他函数需要完整的日期,并且对于不完整的日期返回 NULL。这些函数包括执行日期算术或将日期部分映射到名称的函数。例如

mysql> SELECT DATE_ADD('2006-05-00',INTERVAL 1 DAY);
        -> NULL
mysql> SELECT DAYNAME('2006-05-00');
        -> NULL

当传递 DATE() 函数值作为参数时,有几个函数是严格的,并且会拒绝日期部分为零的不完整日期:CONVERT_TZ()DATE_ADD()DATE_SUB()DAYOFYEAR()TIMESTAMPDIFF()TO_DAYS()TO_SECONDS()WEEK()WEEKDAY()WEEKOFYEAR()YEARWEEK()

TIMEDATETIMETIMESTAMP 值支持小数秒,精度最高为微秒。采用时间参数的函数接受带小数秒的值。时间函数的返回值根据需要包含小数秒。

  • ADDDATE(日期,INTERVAL 表达式 单位)ADDDATE(日期,天数)

    当使用第二个参数的 INTERVAL 形式调用时,ADDDATE()DATE_ADD() 的同义词。相关函数 SUBDATE()DATE_SUB() 的同义词。有关 INTERVAL 单位 参数的信息,请参阅时间间隔

    mysql> SELECT DATE_ADD('2008-01-02', INTERVAL 31 DAY);
            -> '2008-02-02'
    mysql> SELECT ADDDATE('2008-01-02', INTERVAL 31 DAY);
            -> '2008-02-02'

    当使用第二个参数的 天数 形式调用时,MySQL 将其视为要添加到 表达式 中的整数天数。

    mysql> SELECT ADDDATE('2008-01-02', 31);
            -> '2008-02-02'

    如果 日期天数NULL,则此函数返回 NULL

  • ADDTIME(表达式1,表达式2)

    ADDTIME()表达式2 添加到 表达式1 并返回结果。表达式1 是时间或日期时间表达式,表达式2 是时间表达式。如果 表达式1表达式2NULL,则返回 NULL

    此函数和 SUBTIME() 函数的返回类型确定如下

    • 如果第一个参数是动态参数(例如在预处理语句中),则返回类型为 TIME

    • 否则,函数的解析类型是从第一个参数的解析类型派生的。

    mysql> SELECT ADDTIME('2007-12-31 23:59:59.999999', '1 1:1:1.000002');
            -> '2008-01-02 01:01:01.000001'
    mysql> SELECT ADDTIME('01:00:00.999999', '02:00:00.999998');
            -> '03:00:01.999997'
  • CONVERT_TZ(dt,from_tz,to_tz)

    CONVERT_TZ() 将日期时间值 dtfrom_tz 给定的时区转换为 to_tz 给定的时区,并返回结果值。时区的指定方式如第 7.1.15 节 “MySQL 服务器时区支持” 中所述。如果任何参数无效或任何参数为 NULL,则此函数返回 NULL

    在 32 位平台上,此函数支持的值范围与 TIMESTAMP 类型的支持范围相同(有关范围信息,请参阅第 13.2.1 节 “日期和时间数据类型语法”)。在 64 位平台上,最大支持值为 '3001-01-18 23:59:59.999999' UTC。

    无论平台或 MySQL 版本如何,如果该值在从 from_tz 转换为 UTC 时超出支持范围,则不会进行转换。

    mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','GMT','MET');
            -> '2004-01-01 13:00:00'
    mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00');
            -> '2004-01-01 22:00:00'
    注意

    要使用命名时区(例如 'MET''Europe/Amsterdam'),必须正确设置时区表。有关说明,请参阅第 7.1.15 节 “MySQL 服务器时区支持”

  • CURDATE()

    返回当前日期,格式为 'YYYY-MM-DD'YYYYMMDD,具体取决于该函数是在字符串上下文还是数字上下文中使用。

    mysql> SELECT CURDATE();
            -> '2008-06-13'
    mysql> SELECT CURDATE() + 0;
            -> 20080613
  • CURRENT_DATECURRENT_DATE()

    CURRENT_DATECURRENT_DATE()CURDATE() 的同义词。

  • CURRENT_TIMECURRENT_TIME([fsp])

    CURRENT_TIMECURRENT_TIME()CURTIME() 的同义词。

  • CURRENT_TIMESTAMPCURRENT_TIMESTAMP([fsp])

    CURRENT_TIMESTAMPCURRENT_TIMESTAMP()NOW() 的同义词。

  • CURTIME([fsp])

    返回当前时间,格式为 'hh:mm:ss'hhmmss,具体取决于该函数是在字符串上下文还是数字上下文中使用。该值以会话时区表示。

    如果给出了 fsp 参数来指定从 0 到 6 的小数秒精度,则返回值将包含该位数的小数秒部分。

    mysql> SELECT CURTIME();
    +-----------+
    | CURTIME() |
    +-----------+
    | 19:25:37  |
    +-----------+
    
    mysql> SELECT CURTIME() + 0;
    +---------------+
    | CURTIME() + 0 |
    +---------------+
    |        192537 |
    +---------------+
    
    mysql> SELECT CURTIME(3);
    +--------------+
    | CURTIME(3)   |
    +--------------+
    | 19:25:37.840 |
    +--------------+
  • DATE(表达式)

    提取日期或日期时间表达式 表达式 的日期部分。如果 表达式NULL,则返回 NULL

    mysql> SELECT DATE('2003-12-31 01:02:03');
            -> '2003-12-31'
  • DATEDIFF(表达式1,表达式2)

    DATEDIFF() 返回 表达式1表达式2,表示为从一个日期到另一个日期的天数。表达式1表达式2 是日期或日期时间表达式。计算中仅使用值的日期部分。

    mysql> SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30');
            -> 1
    mysql> SELECT DATEDIFF('2010-11-30 23:59:59','2010-12-31');
            -> -31

    如果 表达式1表达式2NULL,则此函数返回 NULL

  • DATE_ADD(日期,INTERVAL 表达式 单位)DATE_SUB(日期,INTERVAL 表达式 单位)

    这些函数执行日期算术。日期 参数指定起始日期或日期时间值。表达式 是一个表达式,用于指定要与起始日期相加或相减的时间间隔值。表达式 被评估为字符串;它可以以 - 开头表示负时间间隔。单位 是一个关键字,指示应如何解释表达式中的单位。

    有关时间间隔语法(包括 单位 说明符的完整列表、每个 单位 值的 表达式 参数的预期形式,以及时间算术中操作数解释的规则)的更多信息,请参阅时间间隔

    返回值取决于参数

    • 如果 日期NULL,则该函数返回 NULL

    • 如果 日期 参数是 DATE 值,并且您的计算仅涉及 YEARMONTHDAY 部分(即没有时间部分),则返回 DATE

    • 如果 日期 参数是 TIME 值,并且计算仅涉及 HOURSMINUTESSECONDS 部分(即没有日期部分),则返回 TIME

    • 如果第一个参数是 DATETIME(或 TIMESTAMP)值,或者如果第一个参数是 DATE单位 值使用 HOURSMINUTESSECONDS,或者如果第一个参数的类型为 TIME单位 值使用 YEARMONTHDAY,则返回 DATETIME

    • 如果第一个参数是动态参数(例如,预处理语句的参数),则如果第二个参数是仅包含 YEARMONTHDAY 值的某种组合的时间间隔,则其解析类型为 DATE;否则,其类型为 DATETIME

    • 否则为字符串(类型 VARCHAR)。

    为了确保结果是 DATETIME,可以使用 CAST() 将第一个参数转换为 DATETIME

    mysql> SELECT DATE_ADD('2018-05-01',INTERVAL 1 DAY);
            -> '2018-05-02'
    mysql> SELECT DATE_SUB('2018-05-01',INTERVAL 1 YEAR);
            -> '2017-05-01'
    mysql> SELECT DATE_ADD('2020-12-31 23:59:59',
        ->                 INTERVAL 1 SECOND);
            -> '2021-01-01 00:00:00'
    mysql> SELECT DATE_ADD('2018-12-31 23:59:59',
        ->                 INTERVAL 1 DAY);
            -> '2019-01-01 23:59:59'
    mysql> SELECT DATE_ADD('2100-12-31 23:59:59',
        ->                 INTERVAL '1:1' MINUTE_SECOND);
            -> '2101-01-01 00:01:00'
    mysql> SELECT DATE_SUB('2025-01-01 00:00:00',
        ->                 INTERVAL '1 1:1:1' DAY_SECOND);
            -> '2024-12-30 22:58:59'
    mysql> SELECT DATE_ADD('1900-01-01 00:00:00',
        ->                 INTERVAL '-1 10' DAY_HOUR);
            -> '1899-12-30 14:00:00'
    mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY);
            -> '1997-12-02'
    mysql> SELECT DATE_ADD('1992-12-31 23:59:59.000002',
        ->            INTERVAL '1.999999' SECOND_MICROSECOND);
            -> '1993-01-01 00:00:01.000001'

    当向 DATEDATETIME 值添加 MONTH 间隔时,如果结果日期包含给定月份中不存在的日期,则日期将调整为该月的最后一天,如下所示

    mysql> SELECT DATE_ADD('2024-03-30', INTERVAL 1 MONTH) AS d1, 
         >        DATE_ADD('2024-03-31', INTERVAL 1 MONTH) AS d2;
    +------------+------------+
    | d1         | d2         |
    +------------+------------+
    | 2024-04-30 | 2024-04-30 |
    +------------+------------+
    1 row in set (0.00 sec)
  • DATE_FORMAT(date,format)

    根据 format 字符串格式化 date 值。如果任一参数为 NULL,则函数返回 NULL

    下表中显示的说明符可以在 format 字符串中使用。格式说明符字符前面需要加 % 字符。说明符也适用于其他函数:STR_TO_DATE()TIME_FORMAT()UNIX_TIMESTAMP()

    说明符 说明
    %a 缩写的星期几名称(Sun..Sat
    %b 缩写的月份名称(Jan..Dec
    %c 月份,数字(0..12
    %D 带有英文后缀的月份中的日期(0th1st2nd3rd,…)
    %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 AMPM
    %r 时间,12 小时制(hh:mm:ss 后跟 AMPM
    %S 秒(00..59
    %s 秒(00..59
    %T 时间,24 小时制(hh:mm:ss
    %U 周(00..53),其中星期日是每周的第一天;WEEK() 模式 0
    %u 周(00..53),其中星期一是每周的第一天;WEEK() 模式 1
    %V 周(01..53),其中星期日是每周的第一天;WEEK() 模式 2;与 %X 一起使用
    %v 周(01..53),其中星期一是每周的第一天;WEEK() 模式 3;与 %x 一起使用
    %W 星期几名称(Sunday..Saturday
    %w 星期几(0=星期日..6=星期六)
    %X 星期日为每周第一天的年份,数字,四位数;与 %V 一起使用
    %x 星期一为每周第一天的年份,数字,四位数;与 %v 一起使用
    %Y 年份,数字,四位数
    %y 年份,数字(两位数)
    %% 文字 % 字符
    %x 对于上面未列出的任何 xx

    月份和日期说明符的范围从零开始,因为 MySQL 允许存储不完整的日期,例如 '2014-00-00'

    用于星期几和月份名称及缩写的语言由 lc_time_names 系统变量的值控制(第 12.16 节“MySQL 服务器区域设置支持”)。

    有关 %U%u%V%v 说明符,请参阅 WEEK() 函数的说明以获取有关模式值的信息。该模式会影响周编号的发生方式。

    DATE_FORMAT() 返回一个字符串,其字符集和排序规则由 character_set_connectioncollation_connection 给出,以便它可以返回包含非 ASCII 字符的月份和星期几名称。

    mysql> SELECT DATE_FORMAT('2009-10-04 22:23:00', '%W %M %Y');
            -> 'Sunday October 2009'
    mysql> SELECT DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s');
            -> '22:23:00'
    mysql> SELECT DATE_FORMAT('1900-10-04 22:23:00',
        ->                 '%D %y %a %d %m %b %j');
            -> '4th 00 Thu 04 10 Oct 277'
    mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
        ->                 '%H %k %I %r %T %S %w');
            -> '22 22 10 10:23:00 PM 22:23:00 00 6'
    mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V');
            -> '1998 52'
    mysql> SELECT DATE_FORMAT('2006-06-00', '%d');
            -> '00'
  • DATE_SUB(date,INTERVAL expr unit)

    请参阅 DATE_ADD() 的说明。

  • DAY(date)

    DAY()DAYOFMONTH() 的同义词。

  • DAYNAME(date)

    返回 date 的星期几名称。名称使用的语言由 lc_time_names 系统变量的值控制(请参阅 第 12.16 节“MySQL 服务器区域设置支持”)。如果 dateNULL,则返回 NULL

    mysql> SELECT DAYNAME('2007-02-03');
            -> 'Saturday'
  • DAYOFMONTH(date)

    返回 date 的月份中的日期,范围为 131,对于日期部分为零的日期(如 '0000-00-00''2008-00-00'),则返回 0。如果 dateNULL,则返回 NULL

    mysql> SELECT DAYOFMONTH('2007-02-03');
            -> 3
  • DAYOFWEEK(date)

    返回 date 的星期几索引(1 = 星期日,2 = 星期一,…,7 = 星期六)。这些索引值对应于 ODBC 标准。如果 dateNULL,则返回 NULL

    mysql> SELECT DAYOFWEEK('2007-02-03');
            -> 7
  • DAYOFYEAR(date)

    返回 date 的一年中的天数,范围为 1366。如果 dateNULL,则返回 NULL

    mysql> SELECT DAYOFYEAR('2007-02-03');
            -> 34
  • EXTRACT(unit FROM date)

    EXTRACT() 函数使用与 DATE_ADD()DATE_SUB() 相同类型的 unit 说明符,但它从日期中提取部分,而不是执行日期算术。有关 unit 参数的信息,请参阅 时间间隔。如果 dateNULL,则返回 NULL

    mysql> SELECT EXTRACT(YEAR FROM '2019-07-02');
            -> 2019
    mysql> SELECT EXTRACT(YEAR_MONTH FROM '2019-07-02 01:02:03');
            -> 201907
    mysql> SELECT EXTRACT(DAY_MINUTE FROM '2019-07-02 01:02:03');
            -> 20102
    mysql> SELECT EXTRACT(MICROSECOND
        ->                FROM '2003-01-02 10:30:00.000123');
            -> 123
  • FROM_DAYS(N)

    给定天数 N,返回 DATE 值。如果 NNULL,则返回 NULL

    mysql> SELECT FROM_DAYS(730669);
            -> '2000-07-03'

    在旧日期上使用 FROM_DAYS() 时要小心。它不适用于早于公历(1582 年)的值。请参阅 第 13.2.7 节“MySQL 使用什么日历?”

  • FROM_UNIXTIME(unix_timestamp[,format])

    以日期时间或字符串值的形式返回 unix_timestamp 的表示形式。返回值使用会话时区表示。(客户端可以按照 第 7.1.15 节“MySQL 服务器时区支持” 中的说明设置会话时区。)unix_timestamp 是一个内部时间戳值,表示自 UTC 时间 '1970-01-01 00:00:00' 以来的秒数,例如 UNIX_TIMESTAMP() 函数生成的值。

    如果省略 format,则此函数返回 DATETIME 值。

    如果 unix_timestampformatNULL,则此函数返回 NULL

    如果 unix_timestamp 是整数,则 DATETIME 的小数秒精度为零。当 unix_timestamp 是十进制值时,DATETIME 的小数秒精度与十进制值的精度相同,最大为 6。当 unix_timestamp 是浮点数时,日期时间的小数秒精度为 6。

    在 32 位平台上,unix_timestamp 的最大有用值为 2147483647.999999,它返回 '2038-01-19 03:14:07.999999' UTC。在 64 位平台上,有效最大值为 32536771199.999999,它返回 '3001-01-18 23:59:59.999999' UTC。无论平台或版本如何,大于有效最大值的 unix_timestamp 值都将返回 0

    format 用于格式化结果,其方式与用于 DATE_FORMAT() 函数的格式字符串相同。如果提供了 format,则返回值为 VARCHAR

    mysql> SELECT FROM_UNIXTIME(1447430881);
            -> '2015-11-13 10:08:01'
    mysql> SELECT FROM_UNIXTIME(1447430881) + 0;
            -> 20151113100801
    mysql> SELECT FROM_UNIXTIME(1447430881,
        ->                      '%Y %D %M %h:%i:%s %x');
            -> '2015 13th November 10:08:01 2015'
    注意

    如果使用 UNIX_TIMESTAMP()FROM_UNIXTIME() 在非 UTC 时区中的值和 Unix 时间戳值之间进行转换,则转换是有损的,因为映射在两个方向上都不是一对一的。有关详细信息,请参阅 UNIX_TIMESTAMP() 函数的说明。

  • GET_FORMAT({DATE|TIME|DATETIME}, {'EUR'|'USA'|'JIS'|'ISO'|'INTERNAL'})

    返回格式字符串。此函数与 DATE_FORMAT()STR_TO_DATE() 函数结合使用非常有用。

    如果 formatNULL,则此函数返回 NULL

    第一个和第二个参数的可能值会导致几种可能的格式字符串(有关使用的说明符,请参阅 DATE_FORMAT() 函数说明中的表)。ISO 格式指的是 ISO 9075,而不是 ISO 8601。

    TIMESTAMP 也可以用作 GET_FORMAT() 的第一个参数,在这种情况下,该函数返回与 DATETIME 相同的值。

    mysql> SELECT DATE_FORMAT('2003-10-03',GET_FORMAT(DATE,'EUR'));
            -> '03.10.2003'
    mysql> SELECT STR_TO_DATE('10.31.2003',GET_FORMAT(DATE,'USA'));
            -> '2003-10-31'
  • HOUR(time)

    返回 time 的小时值。对于时间值,返回值的范围是 023。但是,TIME 值的范围实际上要大得多,因此 HOUR 可以返回大于 23 的值。如果 timeNULL,则返回 NULL

    mysql> SELECT HOUR('10:05:03');
            -> 10
    mysql> SELECT HOUR('272:59:59');
            -> 272
  • LAST_DAY(date)

    接受日期或日期时间值,并返回该月最后一天的对应值。如果参数无效或为 NULL,则返回 NULL

    mysql> SELECT LAST_DAY('2003-02-05');
            -> '2003-02-28'
    mysql> SELECT LAST_DAY('2004-02-05');
            -> '2004-02-29'
    mysql> SELECT LAST_DAY('2004-01-01 01:01:01');
            -> '2004-01-31'
    mysql> SELECT LAST_DAY('2003-03-32');
            -> NULL
  • LOCALTIME, LOCALTIME([fsp])

    LOCALTIMELOCALTIME()NOW() 的同义词。

  • LOCALTIMESTAMP, LOCALTIMESTAMP([fsp])

    LOCALTIMESTAMPLOCALTIMESTAMP()NOW() 的同义词。

  • MAKEDATE(year,dayofyear)

    根据给定的年份和一年中的天数返回日期。 dayofyear 必须大于 0,否则结果为 NULL。如果任一参数为 NULL,则结果也为 NULL

    mysql> SELECT MAKEDATE(2011,31), MAKEDATE(2011,32);
            -> '2011-01-31', '2011-02-01'
    mysql> SELECT MAKEDATE(2011,365), MAKEDATE(2014,365);
            -> '2011-12-31', '2014-12-31'
    mysql> SELECT MAKEDATE(2011,0);
            -> NULL
  • MAKETIME(hour,minute,second)

    返回根据 hourminutesecond 参数计算的时间值。如果任何参数为 NULL,则返回 NULL

    second 参数可以是小数。

    mysql> SELECT MAKETIME(12,15,30);
            -> '12:15:30'
  • MICROSECOND(expr)

    从时间或日期时间表达式 expr 中返回微秒数,范围为 0999999。如果 exprNULL,则返回 NULL

    mysql> SELECT MICROSECOND('12:00:00.123456');
            -> 123456
    mysql> SELECT MICROSECOND('2019-12-31 23:59:59.000010');
            -> 10
  • MINUTE(time)

    返回 time 的分钟值,范围为 059,如果 timeNULL,则返回 NULL

    mysql> SELECT MINUTE('2008-02-03 10:05:03');
            -> 5
  • MONTH(date)

    返回 date 的月份,1 月到 12 月的范围为 112,对于月份部分为零的日期(如 '0000-00-00''2008-00-00')则返回 0。如果 dateNULL,则返回 NULL

    mysql> SELECT MONTH('2008-02-03');
            -> 2
  • MONTHNAME(date)

    返回 date 的月份全称。月份名称使用的语言由 lc_time_names 系统变量的值控制(第 12.16 节 “MySQL 服务器区域设置支持”)。如果 dateNULL,则返回 NULL

    mysql> SELECT MONTHNAME('2008-02-03');
            -> 'February'
  • NOW([fsp])

    'YYYY-MM-DD hh:mm:ss'YYYYMMDDhhmmss 格式返回当前日期和时间,具体取决于函数是在字符串上下文中还是在数字上下文中使用。该值以会话时区表示。

    如果给出了 fsp 参数来指定从 0 到 6 的小数秒精度,则返回值将包含该位数的小数秒部分。

    mysql> SELECT NOW();
            -> '2007-12-15 23:50:26'
    mysql> SELECT NOW() + 0;
            -> 20071215235026.000000

    NOW() 返回一个常量时间,表示语句开始执行的时间。(在存储函数或触发器中,NOW() 返回函数或触发语句开始执行的时间。)这与 SYSDATE() 的行为不同,后者返回执行的确切时间。

    mysql> SELECT NOW(), SLEEP(2), NOW();
    +---------------------+----------+---------------------+
    | NOW()               | SLEEP(2) | NOW()               |
    +---------------------+----------+---------------------+
    | 2006-04-12 13:47:36 |        0 | 2006-04-12 13:47:36 |
    +---------------------+----------+---------------------+
    
    mysql> SELECT SYSDATE(), SLEEP(2), SYSDATE();
    +---------------------+----------+---------------------+
    | SYSDATE()           | SLEEP(2) | SYSDATE()           |
    +---------------------+----------+---------------------+
    | 2006-04-12 13:47:44 |        0 | 2006-04-12 13:47:46 |
    +---------------------+----------+---------------------+

    此外,SET TIMESTAMP 语句会影响 NOW() 返回的值,但不会影响 SYSDATE() 返回的值。这意味着二进制日志中的时间戳设置对 SYSDATE() 的调用没有影响。将时间戳设置为非零值会导致对 NOW() 的每次后续调用都返回该值。将时间戳设置为零将取消此效果,以便 NOW() 再次返回当前日期和时间。

    有关这两个函数之间区别的更多信息,请参见 SYSDATE() 的说明。

  • PERIOD_ADD(P,N)

    N 个月添加到周期 P(格式为 YYMMYYYYMM)。返回值的格式为 YYYYMM

    注意

    周期参数 P 不是 日期值。

    如果 PNNULL,则此函数返回 NULL

    mysql> SELECT PERIOD_ADD(200801,2);
            -> 200803
  • PERIOD_DIFF(P1,P2)

    返回周期 P1P2 之间的月数。 P1P2 的格式应为 YYMMYYYYMM。请注意,周期参数 P1P2 不是 日期值。

    如果 P1P2NULL,则此函数返回 NULL

    mysql> SELECT PERIOD_DIFF(200802,200703);
            -> 11
  • QUARTER(date)

    返回 date 的季度,范围为 14,如果 dateNULL,则返回 NULL

    mysql> SELECT QUARTER('2008-04-01');
            -> 2
  • SECOND(time)

    返回 time 的秒数,范围为 059,如果 timeNULL,则返回 NULL

    mysql> SELECT SECOND('10:05:03');
            -> 3
  • SEC_TO_TIME(seconds)

    返回 seconds 参数,转换为小时、分钟和秒,作为 TIME 值。结果的范围限制为 TIME 数据类型的范围。如果参数对应于超出该范围的值,则会发出警告。

    如果 secondsNULL,则该函数返回 NULL

    mysql> SELECT SEC_TO_TIME(2378);
            -> '00:39:38'
    mysql> SELECT SEC_TO_TIME(2378) + 0;
            -> 3938
  • STR_TO_DATE(str,format)

    这是 DATE_FORMAT() 函数的反函数。它接受一个字符串 str 和一个格式字符串 format。如果格式字符串同时包含日期和时间部分,则 STR_TO_DATE() 返回 DATETIME 值;如果字符串仅包含日期或时间部分,则返回 DATETIME 值。如果 strformatNULL,则该函数返回 NULL。如果无法根据服务器遵循的规则解析从 str 中提取的日期、时间或日期时间值,则 STR_TO_DATE() 将返回 NULL 并生成警告。

    服务器扫描 str,尝试将 format 与之匹配。格式字符串可以包含字面字符和以 % 开头的格式说明符。format 中的字面字符必须与 str 中的字面字符完全匹配。format 中的格式说明符必须与 str 中的日期或时间部分匹配。有关可在 format 中使用的说明符,请参见 DATE_FORMAT() 函数说明。

    mysql> SELECT STR_TO_DATE('01,5,2013','%d,%m,%Y');
            -> '2013-05-01'
    mysql> SELECT STR_TO_DATE('May 1, 2013','%M %d,%Y');
            -> '2013-05-01'

    扫描从 str 的开头开始,如果发现 format 不匹配,则扫描失败。str 末尾的多余字符将被忽略。

    mysql> SELECT STR_TO_DATE('a09:30:17','a%h:%i:%s');
            -> '09:30:17'
    mysql> SELECT STR_TO_DATE('a09:30:17','%h:%i:%s');
            -> NULL
    mysql> SELECT STR_TO_DATE('09:30:17a','%h:%i:%s');
            -> '09:30:17'

    未指定的日期或时间部分的值为 0,因此 str 中未完全指定的值会产生部分或全部部分设置为 0 的结果。

    mysql> SELECT STR_TO_DATE('abc','abc');
            -> '0000-00-00'
    mysql> SELECT STR_TO_DATE('9','%m');
            -> '0000-09-00'
    mysql> SELECT STR_TO_DATE('9','%s');
            -> '00:00:09'

    对日期值各部分的范围检查如 第 13.2.2 节 “日期、日期时间和时间戳类型” 中所述。这意味着,例如,允许使用 日期或部分值为 0 的日期,除非 SQL 模式设置为不允许此类值。

    mysql> SELECT STR_TO_DATE('00/00/0000', '%m/%d/%Y');
            -> '0000-00-00'
    mysql> SELECT STR_TO_DATE('04/31/2004', '%m/%d/%Y');
            -> '2004-04-31'

    如果启用了 NO_ZERO_DATE SQL 模式,则不允许使用零日期。在这种情况下,STR_TO_DATE() 将返回 NULL 并生成警告。

    mysql> SET sql_mode = '';
    mysql> SELECT STR_TO_DATE('00/00/0000', '%m/%d/%Y');
    +---------------------------------------+
    | STR_TO_DATE('00/00/0000', '%m/%d/%Y') |
    +---------------------------------------+
    | 0000-00-00                            |
    +---------------------------------------+
    mysql> SET sql_mode = 'NO_ZERO_DATE';
    mysql> SELECT STR_TO_DATE('00/00/0000', '%m/%d/%Y');
    +---------------------------------------+
    | STR_TO_DATE('00/00/0000', '%m/%d/%Y') |
    +---------------------------------------+
    | NULL                                  |
    +---------------------------------------+
    mysql> SHOW WARNINGS\G
    *************************** 1. row ***************************
      Level: Warning
       Code: 1411
    Message: Incorrect datetime value: '00/00/0000' for function str_to_date

    在 MySQL 的某些先前版本中,可以将无效日期字符串(例如 '2021-11-31')传递给此函数。在 MySQL 8.4 中,STR_TO_DATE() 会执行完整的范围检查,如果转换后的日期无效,则会引发错误。

    注意

    不能使用格式 "%X%V" 将年-周字符串转换为日期,因为如果周跨越月份边界,则年份和周的组合不能唯一标识年份和月份。要将年-周转换为日期,还应指定星期几。

    mysql> SELECT STR_TO_DATE('200442 Monday', '%X%V %W');
            -> '2004-10-18'

    您还应该注意,对于日期和日期时间值的日期部分,STR_TO_DATE() 只检查年、月和日的有效性。更准确地说,这意味着将检查年份以确保它在 0-9999 范围内(含),检查月份以确保它在 1-12 范围内(含),并检查日期以确保它在 1-31 范围内(含),但服务器不会组合检查这些值。例如,SELECT STR_TO_DATE('23-2-31', '%Y-%m-%d') 返回 2023-02-31。启用或禁用 ALLOW_INVALID_DATES 服务器 SQL 模式对此行为没有影响。有关更多信息,请参见 第 13.2.2 节“DATE、DATETIME 和 TIMESTAMP 类型”

  • SUBDATE(日期,INTERVAL 表达式 单位), SUBDATE(表达式,天数)

    当使用第二个参数的 INTERVAL 形式调用时,SUBDATE()DATE_SUB() 的同义词。有关 INTERVAL 单位 参数的信息,请参见 DATE_ADD() 的讨论。

    mysql> SELECT DATE_SUB('2008-01-02', INTERVAL 31 DAY);
            -> '2007-12-02'
    mysql> SELECT SUBDATE('2008-01-02', INTERVAL 31 DAY);
            -> '2007-12-02'

    第二种形式允许对 天数 使用整数值。在这种情况下,它被解释为要从日期或日期时间表达式 表达式 中减去的天数。

    mysql> SELECT SUBDATE('2008-01-02 12:00:00', 31);
            -> '2007-12-02 12:00:00'

    如果任何参数为 NULL,则此函数返回 NULL

  • SUBTIME(表达式1,表达式2)

    SUBTIME() 返回 表达式1 - 表达式2,其值格式与 表达式1 相同。表达式1 是时间或日期时间表达式,而 表达式2 是时间表达式。

    此函数返回类型的解析方式与 ADDTIME() 函数相同;有关更多信息,请参见该函数的说明。

    mysql> SELECT SUBTIME('2007-12-31 23:59:59.999999','1 1:1:1.000002');
            -> '2007-12-30 22:58:58.999997'
    mysql> SELECT SUBTIME('01:00:00.999999', '02:00:00.999998');
            -> '-00:59:59.999999'

    如果 表达式1表达式2NULL,则此函数返回 NULL

  • SYSDATE([fsp])

    'YYYY-MM-DD hh:mm:ss'YYYYMMDDhhmmss 格式返回当前日期和时间,具体取决于该函数是在字符串还是数字上下文中使用。

    如果给出了 fsp 参数来指定从 0 到 6 的小数秒精度,则返回值将包含该位数的小数秒部分。

    SYSDATE() 返回其执行的时间。这与 NOW() 的行为不同,后者返回一个常量时间,指示语句开始执行的时间。(在存储函数或触发器中,NOW() 返回函数或触发语句开始执行的时间。)

    mysql> SELECT NOW(), SLEEP(2), NOW();
    +---------------------+----------+---------------------+
    | NOW()               | SLEEP(2) | NOW()               |
    +---------------------+----------+---------------------+
    | 2006-04-12 13:47:36 |        0 | 2006-04-12 13:47:36 |
    +---------------------+----------+---------------------+
    
    mysql> SELECT SYSDATE(), SLEEP(2), SYSDATE();
    +---------------------+----------+---------------------+
    | SYSDATE()           | SLEEP(2) | SYSDATE()           |
    +---------------------+----------+---------------------+
    | 2006-04-12 13:47:44 |        0 | 2006-04-12 13:47:46 |
    +---------------------+----------+---------------------+

    此外,SET TIMESTAMP 语句会影响 NOW() 返回的值,但不会影响 SYSDATE() 返回的值。这意味着二进制日志中的时间戳设置对 SYSDATE() 的调用没有影响。

    因为 SYSDATE() 即使在同一个语句中也可以返回不同的值,并且不受 SET TIMESTAMP 的影响,所以如果使用基于语句的二进制日志记录,则它是不确定的,因此对于复制是不安全的。如果这是一个问题,您可以使用基于行的日志记录。

    或者,您可以使用 --sysdate-is-now 选项使 SYSDATE() 成为 NOW() 的别名。如果在复制源服务器和副本上都使用此选项,则此方法有效。

    SYSDATE() 的不确定性也意味着索引不能用于评估引用它的表达式。

  • TIME(表达式)

    提取时间或日期时间表达式 表达式 的时间部分,并将其作为字符串返回。如果 表达式NULL,则返回 NULL

    此函数对于基于语句的复制不安全。如果在 binlog_format 设置为 STATEMENT 时使用此函数,则会记录警告。

    mysql> SELECT TIME('2003-12-31 01:02:03');
            -> '01:02:03'
    mysql> SELECT TIME('2003-12-31 01:02:03.000123');
            -> '01:02:03.000123'
  • TIMEDIFF(表达式1,表达式2)

    TIMEDIFF() 返回 表达式1 - 表达式2,表示为时间值。表达式1表达式2 是转换为 TIMEDATETIME 表达式的字符串;转换后,它们必须属于同一类型。如果 表达式1表达式2NULL,则返回 NULL

    TIMEDIFF() 返回的结果限制在 TIME 值允许的范围内。或者,您可以使用 TIMESTAMPDIFF()UNIX_TIMESTAMP() 这两个函数,它们都返回整数。

    mysql> SELECT TIMEDIFF('2000-01-01 00:00:00',
        ->                 '2000-01-01 00:00:00.000001');
            -> '-00:00:00.000001'
    mysql> SELECT TIMEDIFF('2008-12-31 23:59:59.000001',
        ->                 '2008-12-30 01:01:01.000002');
            -> '46:58:57.999999'
  • TIMESTAMP(表达式), TIMESTAMP(表达式1,表达式2)

    对于单个参数,此函数将日期或日期时间表达式 表达式 作为日期时间值返回。对于两个参数,它将时间表达式 表达式2 添加到日期或日期时间表达式 表达式1 中,并将结果作为日期时间值返回。如果 表达式表达式1表达式2NULL,则返回 NULL

    mysql> SELECT TIMESTAMP('2003-12-31');
            -> '2003-12-31 00:00:00'
    mysql> SELECT TIMESTAMP('2003-12-31 12:00:00','12:00:00');
            -> '2004-01-01 00:00:00'
  • TIMESTAMPADD(单位,时间间隔,datetime_expr)

    将整数表达式 时间间隔 添加到日期或日期时间表达式 datetime_expr 中。时间间隔 的单位由 单位 参数给出,该参数应为以下值之一:MICROSECOND(微秒)、SECONDMINUTEHOURDAYWEEKMONTHQUARTERYEAR

    单位 值可以使用所示的关键字之一或 SQL_TSI_ 的前缀指定。例如,DAYSQL_TSI_DAY 都是合法的。

    如果 时间间隔datetime_exprNULL,则此函数返回 NULL

    mysql> SELECT TIMESTAMPADD(MINUTE, 1, '2003-01-02');
            -> '2003-01-02 00:01:00'
    mysql> SELECT TIMESTAMPADD(WEEK,1,'2003-01-02');
            -> '2003-01-09'

    当向 DATEDATETIME 值添加 MONTH 间隔时,如果结果日期包含给定月份中不存在的日期,则日期将调整为该月的最后一天,如下所示

    mysql> SELECT TIMESTAMPADD(MONTH, 1, DATE '2024-03-30') AS t1, 
         >        TIMESTAMPADD(MONTH, 1, DATE '2024-03-31') AS t2;
    +------------+------------+
    | t1         | t2         |
    +------------+------------+
    | 2024-04-30 | 2024-04-30 |
    +------------+------------+
    1 row in set (0.00 sec)
  • TIMESTAMPDIFF(单位,datetime_expr1,datetime_expr2)

    返回 datetime_expr2 - datetime_expr1,其中 datetime_expr1datetime_expr2 是日期或日期时间表达式。一个表达式可以是日期,另一个表达式可以是日期时间;日期值在必要时被视为时间部分为 '00:00:00' 的日期时间。结果的单位(一个整数)由 单位 参数给出。单位 的合法值与 TIMESTAMPADD() 函数说明中列出的值相同。

    如果 datetime_expr1datetime_expr2NULL,则此函数返回 NULL

    mysql> SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01');
            -> 3
    mysql> SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01');
            -> -1
    mysql> SELECT TIMESTAMPDIFF(MINUTE,'2003-02-01','2003-05-01 12:05:55');
            -> 128885
    注意

    此函数的日期或日期时间参数的顺序与使用 2 个参数调用 TIMESTAMP() 函数时使用的顺序相反。

  • TIME_FORMAT(时间,格式)

    这与 DATE_FORMAT() 函数的使用方式类似,但 格式 字符串只能包含小时、分钟、秒和微秒的格式说明符。其他说明符将生成 NULL0。如果 时间格式NULL,则 TIME_FORMAT() 返回 NULL

    如果 时间 值包含的小时部分大于 23,则 %H%k 小时格式说明符生成的值将大于 0..23 的通常范围。其他小时格式说明符生成的小时值为模 12。

    mysql> SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l');
            -> '100 100 04 04 4'
  • TIME_TO_SEC(时间)

    返回转换为秒的 时间 参数。如果 时间NULL,则返回 NULL

    mysql> SELECT TIME_TO_SEC('22:23:00');
            -> 80580
    mysql> SELECT TIME_TO_SEC('00:39:38');
            -> 2378
  • TO_DAYS(日期)

    给定日期 日期,返回一个天数(自 0 年以来的天数)。如果 日期NULL,则返回 NULL

    mysql> SELECT TO_DAYS(950501);
            -> 728779
    mysql> SELECT TO_DAYS('2007-10-07');
            -> 733321

    TO_DAYS() 不适用于公历(1582 年)出现之前的日期值,因为它没有考虑到更改日历时丢失的天数。对于 1582 年(以及其他地区的更晚年份)之前的日期,此函数的结果不可靠。有关详细信息,请参见 第 13.2.7 节“MySQL 使用什么日历?”

    请记住,MySQL 使用 第 13.2 节“日期和时间数据类型” 中的规则将日期中的两位数年份值转换为四位数年份值。例如,'2008-10-07''08-10-07' 被视为相同的日期

    mysql> SELECT TO_DAYS('2008-10-07'), TO_DAYS('08-10-07');
            -> 733687, 733687

    在 MySQL 中,零日期定义为 '0000-00-00',即使该日期本身被认为无效。这意味着,对于 '0000-00-00''0000-01-01'TO_DAYS() 返回此处显示的值

    mysql> SELECT TO_DAYS('0000-00-00');
    +-----------------------+
    | to_days('0000-00-00') |
    +-----------------------+
    |                  NULL |
    +-----------------------+
    1 row in set, 1 warning (0.00 sec)
    
    mysql> SHOW WARNINGS;
    +---------+------+----------------------------------------+
    | Level   | Code | Message                                |
    +---------+------+----------------------------------------+
    | Warning | 1292 | Incorrect datetime value: '0000-00-00' |
    +---------+------+----------------------------------------+
    1 row in set (0.00 sec)
    
    
    mysql> SELECT TO_DAYS('0000-01-01');
    +-----------------------+
    | to_days('0000-01-01') |
    +-----------------------+
    |                     1 |
    +-----------------------+
    1 row in set (0.00 sec)

    无论是否启用了 ALLOW_INVALID_DATES SQL 服务器模式,都是如此。

  • TO_SECONDS(表达式)

    给定日期或日期时间 表达式,返回自 0 年以来的秒数。如果 表达式 不是有效的日期或日期时间值(包括 NULL),则返回 NULL

    mysql> SELECT TO_SECONDS(950501);
            -> 62966505600
    mysql> SELECT TO_SECONDS('2009-11-29');
            -> 63426672000
    mysql> SELECT TO_SECONDS('2009-11-29 13:43:32');
            -> 63426721412
    mysql> SELECT TO_SECONDS( NOW() );
            -> 63426721458

    TO_DAYS() 一样,TO_SECONDS() 不适用于公历(1582 年)出现之前的日期值,因为它没有考虑到更改日历时丢失的天数。对于 1582 年(以及其他地区的更晚年份)之前的日期,此函数的结果不可靠。有关详细信息,请参见 第 13.2.7 节“MySQL 使用什么日历?”

    TO_DAYS() 类似,TO_SECONDS() 会使用 第 13.2 节 “日期和时间数据类型” 中的规则将日期中的两位数年份值转换为四位数年份格式。

    在 MySQL 中,零日期定义为 '0000-00-00',即使该日期本身被视为无效日期。 这意味着,对于 '0000-00-00''0000-01-01'TO_SECONDS() 返回此处显示的值

    mysql> SELECT TO_SECONDS('0000-00-00');
    +--------------------------+
    | TO_SECONDS('0000-00-00') |
    +--------------------------+
    |                     NULL |
    +--------------------------+
    1 row in set, 1 warning (0.00 sec)
    
    mysql> SHOW WARNINGS;
    +---------+------+----------------------------------------+
    | Level   | Code | Message                                |
    +---------+------+----------------------------------------+
    | Warning | 1292 | Incorrect datetime value: '0000-00-00' |
    +---------+------+----------------------------------------+
    1 row in set (0.00 sec)
    
    
    mysql> SELECT TO_SECONDS('0000-01-01');
    +--------------------------+
    | TO_SECONDS('0000-01-01') |
    +--------------------------+
    |                    86400 |
    +--------------------------+
    1 row in set (0.00 sec)

    无论是否启用了 ALLOW_INVALID_DATES SQL 服务器模式,都是如此。

  • UNIX_TIMESTAMP([date])

    如果在没有 date 参数的情况下调用 UNIX_TIMESTAMP(),它会返回一个 Unix 时间戳,表示自 '1970-01-01 00:00:00' UTC 以来的秒数。

    如果使用 date 参数调用 UNIX_TIMESTAMP(),它会返回自 '1970-01-01 00:00:00' UTC 以来的秒数形式表示的参数值。服务器将 date 解释为会话时区中的值,并将其转换为 UTC 中的内部 Unix 时间戳值。(客户端可以按照 第 7.1.15 节 “MySQL 服务器时区支持” 中的说明设置会话时区。)date 参数可以是 DATEDATETIMETIMESTAMP 字符串,也可以是 YYMMDDYYMMDDhhmmssYYYYMMDDYYYYMMDDhhmmss 格式的数字。如果参数包含时间部分,则它可以选择性地包含小数秒部分。

    如果没有给出参数或参数不包含小数秒部分,则返回值为整数;如果给出的参数包含小数秒部分,则返回值为 DECIMAL

    date 参数是 TIMESTAMP 列时,UNIX_TIMESTAMP() 直接返回内部时间戳值,不进行隐式“字符串到 Unix 时间戳”转换。

    参数值的有效范围与 TIMESTAMP 数据类型的有效范围相同:对于 32 位平台,为 UTC '1970-01-01 00:00:01.000000''2038-01-19 03:14:07.999999';对于在 64 位平台上运行的 MySQL,UNIX_TIMESTAMP() 的参数值的有效范围为 UTC '1970-01-01 00:00:01.000000''3001-01-19 03:14:07.999999'(对应于 32536771199.999999 秒)。

    无论 MySQL 版本或平台架构如何,如果将超出范围的日期传递给 UNIX_TIMESTAMP(),它都会返回 0。如果 dateNULL,则它返回 NULL

    mysql> SELECT UNIX_TIMESTAMP();
            -> 1447431666
    mysql> SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19');
            -> 1447431619
    mysql> SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19.012');
            -> 1447431619.012

    如果使用 UNIX_TIMESTAMP()FROM_UNIXTIME() 在非 UTC 时区中的值与 Unix 时间戳值之间进行转换,则转换是有损的,因为映射在两个方向上都不是一对一的。例如,由于诸如夏令时 (DST) 之类的本地时区更改的惯例,UNIX_TIMESTAMP() 可以将非 UTC 时区中不同的两个值映射到同一个 Unix 时间戳值。FROM_UNIXTIME() 仅将该值映射回原始值之一。下面是一个示例,它使用了 MET 时区中不同的值

    mysql> SET time_zone = 'MET';
    mysql> SELECT UNIX_TIMESTAMP('2005-03-27 03:00:00');
    +---------------------------------------+
    | UNIX_TIMESTAMP('2005-03-27 03:00:00') |
    +---------------------------------------+
    |                            1111885200 |
    +---------------------------------------+
    mysql> SELECT UNIX_TIMESTAMP('2005-03-27 02:00:00');
    +---------------------------------------+
    | UNIX_TIMESTAMP('2005-03-27 02:00:00') |
    +---------------------------------------+
    |                            1111885200 |
    +---------------------------------------+
    mysql> SELECT FROM_UNIXTIME(1111885200);
    +---------------------------+
    | FROM_UNIXTIME(1111885200) |
    +---------------------------+
    | 2005-03-27 03:00:00       |
    +---------------------------+
    注意

    要使用命名时区(例如 'MET''Europe/Amsterdam'),必须正确设置时区表。有关说明,请参阅第 7.1.15 节 “MySQL 服务器时区支持”

    如果要减去 UNIX_TIMESTAMP() 列,则可能需要将它们转换为带符号的整数。请参阅 第 14.10 节 “强制转换函数和运算符”

  • UTC_DATEUTC_DATE()

    'YYYY-MM-DD'YYYYMMDD 格式返回当前 UTC 日期,具体取决于该函数是在字符串上下文还是数字上下文中使用。

    mysql> SELECT UTC_DATE(), UTC_DATE() + 0;
            -> '2003-08-14', 20030814
  • UTC_TIMEUTC_TIME([fsp])

    'hh:mm:ss'hhmmss 格式返回当前 UTC 时间,具体取决于该函数是在字符串上下文还是数字上下文中使用。

    如果给出了 fsp 参数来指定从 0 到 6 的小数秒精度,则返回值将包含该位数的小数秒部分。

    mysql> SELECT UTC_TIME(), UTC_TIME() + 0;
            -> '18:07:53', 180753.000000
  • UTC_TIMESTAMPUTC_TIMESTAMP([fsp])

    'YYYY-MM-DD hh:mm:ss'YYYYMMDDhhmmss 格式返回当前 UTC 日期和时间,具体取决于该函数是在字符串上下文还是数字上下文中使用。

    如果给出了 fsp 参数来指定从 0 到 6 的小数秒精度,则返回值将包含该位数的小数秒部分。

    mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0;
            -> '2003-08-14 18:08:04', 20030814180804.000000
  • WEEK(date[,mode])

    此函数返回 date 的周数。WEEK() 的双参数形式使您可以指定一周是从星期日还是星期一开始,以及返回值的范围应该是 053 还是 153。如果省略 mode 参数,则使用 default_week_format 系统变量的值。请参阅 第 7.1.8 节 “服务器系统变量”。对于 NULL 日期值,该函数返回 NULL

    下表描述了 mode 参数的工作原理。

    模式 一周的第一天 范围 第 1 周是第一周…
    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 今年包含星期一

    对于含义为“今年有 4 天或更多天”的 mode 值,周数按照 ISO 8601:1988 进行编号

    • 如果包含 1 月 1 日的那一周在新的一年中至少有 4 天,则它是第 1 周。

    • 否则,它是前一年的最后一周,下一周是第 1 周。

    mysql> SELECT WEEK('2008-02-20');
            -> 7
    mysql> SELECT WEEK('2008-02-20',0);
            -> 7
    mysql> SELECT WEEK('2008-02-20',1);
            -> 8
    mysql> SELECT WEEK('2008-12-31',1);
            -> 53

    如果日期落在前一年的最后一周,并且您没有使用 2367 作为可选的 mode 参数,则 MySQL 会返回 0

    mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0);
            -> 2000, 0

    有人可能会争辩说,WEEK() 应该返回 52,因为给定的日期实际上是在 1999 年的第 52 周。 WEEK() 返回 0,以便返回值是“给定年份中的周数”。这使得 WEEK() 函数在与从日期中提取日期部分的其他函数组合使用时是可靠的。

    如果您希望根据包含给定日期所在周的第一天的年份计算结果,请使用 0257 作为可选的 mode 参数。

    mysql> SELECT WEEK('2000-01-01',2);
            -> 52

    或者,使用 YEARWEEK() 函数

    mysql> SELECT YEARWEEK('2000-01-01');
            -> 199952
    mysql> SELECT MID(YEARWEEK('2000-01-01'),5,2);
            -> '52'
  • WEEKDAY(date)

    返回 date 的工作日索引(0 = 星期一,1 = 星期二,… 6 = 星期日)。如果 dateNULL,则返回 NULL

    mysql> SELECT WEEKDAY('2008-02-03 22:23:00');
            -> 6
    mysql> SELECT WEEKDAY('2007-11-06');
            -> 1
  • WEEKOFYEAR(date)

    153 范围内的数字形式返回日期的日历周。如果 dateNULL,则返回 NULL

    WEEKOFYEAR() 是一个兼容性函数,它等效于 WEEK(date,3)

    mysql> SELECT WEEKOFYEAR('2008-02-20');
            -> 8
  • YEAR(date)

    10009999 范围内的数字形式返回 date 的年份,对于“零”日期,则返回 0。如果 dateNULL,则返回 NULL

    mysql> SELECT YEAR('1987-01-01');
            -> 1987
  • YEARWEEK(date)YEARWEEK(date,mode)

    返回日期的年份和周数。对于一年的第一周和最后一周,结果中的年份可能与日期参数中的年份不同。如果 dateNULL,则返回 NULL

    mode 参数的工作方式与 WEEK()mode 参数完全相同。对于单参数语法,使用 mode 值 0。与 WEEK() 不同,default_week_format 的值不会影响 YEARWEEK()

    mysql> SELECT YEARWEEK('1987-01-01');
            -> 198652

    周数与 WEEK() 函数针对可选参数 01 返回的周数(0)不同,因为 WEEK() 会返回给定年份上下文中的周数。