文档主页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (美国信函) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

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() 提取日期或 datetime 表达式的日期部分
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() 当使用三个参数调用时,SUBDATE() 的同义词
SUBTIME() 减去时间
SYSDATE() 返回函数执行的时间
TIME() 提取传递的表达式的時間部分
TIME_FORMAT() 格式化为时间
TIME_TO_SEC() 返回参数转换为秒
TIMEDIFF() 减去时间
TIMESTAMP() 使用单个参数,此函数返回日期或 datetime 表达式;使用两个参数,返回参数的总和
TIMESTAMPADD() 将间隔添加到 datetime 表达式
TIMESTAMPDIFF() 返回两个 datetime 表达式的差值,使用指定的单位
TO_DAYS() 返回日期参数转换为天
TO_SECONDS() 返回日期或 datetime 参数转换为自公元 0 年以来的秒数
UNIX_TIMESTAMP() 返回 Unix 时间戳
UTC_DATE() 返回当前 UTC 日期
UTC_TIME() 返回当前 UTC 时间
UTC_TIMESTAMP() 返回当前 UTC 日期和时间
WEEK() 返回星期数
WEEKDAY() 返回星期索引
WEEKOFYEAR() 返回日期的日历周(1-53)
YEAR() 返回年份
YEARWEEK() 返回年份和星期

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

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

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

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

返回当前日期或时间的函数每个函数在查询执行开始时只求值一次。这意味着在一个查询中对 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(date,INTERVAL expr unit)ADDDATE(date,days)

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

    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'

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

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

    如果 datedaysNULL,则此函数返回 NULL

  • ADDTIME(expr1,expr2)

    ADDTIME()expr2 添加到 expr1 并返回结果。 expr1 是时间或日期时间表达式,而 expr2 是时间表达式。如果 expr1expr2NULL,则返回 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() 将日期时间值 dt 从由 from_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(expr)

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

    mysql> SELECT DATE('2003-12-31 01:02:03');
            -> '2003-12-31'
  • DATEDIFF(expr1,expr2)

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

    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

    如果 expr1expr2NULL,则此函数返回 NULL

  • DATE_ADD(date,INTERVAL expr unit)DATE_SUB(date,INTERVAL expr unit)

    这些函数执行日期运算。 date 参数指定起始日期或日期时间值。 expr 是一个表达式,指定要从起始日期加或减去的间隔值。 expr 作为字符串进行计算;它可能以 - 开头,表示负间隔。 unit 是一个关键字,指示应解释表达式的单位。

    有关时间间隔语法的更多信息,包括 unit 指定符的完整列表、每个 unit 值的 expr 参数的预期形式以及时间运算中操作数解释的规则,请参见 时间间隔

    返回值取决于参数

    • 如果 dateNULL,则函数返回 NULL

    • DATE 如果 date 参数是 DATE 值,并且您的计算只涉及 YEARMONTHDAY 部分(即没有时间部分)。

    • TIME 如果 date 参数是 TIME 值,并且计算只涉及 HOURSMINUTESSECONDS 部分(即没有日期部分)。

    • DATETIME 如果第一个参数是 DATETIME(或 TIMESTAMP)值,或者如果第一个参数是 DATE 并且 unit 值使用 HOURSMINUTESSECONDS,或者如果第一个参数的类型为 TIME 并且 unit 值使用 YEARMONTHDAY

    • 如果第一个参数是动态参数(例如,预处理语句),则其解析类型为 DATE 如果第二个参数是包含 YEARMONTHDAY 值组合的间隔;否则,其类型为 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'

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

    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 带英文后缀的月份日期 (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 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 x,对于上面未列出的任何 x

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

    用于星期和月份名称和缩写的语言由lc_time_names系统变量的值控制 (Section 12.16, “MySQL Server Locale Support”).

    对于 %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系统变量的值控制(参见Section 12.16, “MySQL Server Locale Support”)。如果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参数的信息,请参见Temporal Intervals。如果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) 出现之前的日期。参见Section 13.2.7, “What Calendar Is Used By MySQL?”.

  • FROM_UNIXTIME(unix_timestamp[,format])

    返回unix_timestamp的表示形式,为日期时间或字符字符串值。返回值使用会话时区表示。(客户端可以设置会话时区,如Section 7.1.15, “MySQL Server Time Zone Support”中所述。)unix_timestamp是一个内部时间戳值,表示自'1970-01-01 00:00:00' UTC 以来的秒数,例如由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
  • LOCALTIMELOCALTIME([fsp])

    LOCALTIMELOCALTIME()NOW() 的同义词。

  • LOCALTIMESTAMPLOCALTIMESTAMP([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 的月份,范围为 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 节,“DATE、DATETIME 和 TIMESTAMP 类型” 中所述。这意味着,例如,除非 SQL 模式设置为禁止此类值,否则允许使用 日期或日期部分值都为 0 的日期。

    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 9.0 中,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(date,INTERVAL expr unit)SUBDATE(expr,days)

    当使用第二个参数的 INTERVAL 形式调用时,SUBDATE()DATE_SUB() 的同义词。有关 INTERVAL unit 参数的信息,请参见 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'

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

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

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

  • SUBTIME(expr1,expr2)

    SUBTIME() 返回 expr1expr2,表示为与 expr1 相同格式的值。 expr1 是时间或日期时间表达式,expr2 是时间表达式。

    此函数的返回值类型解析与 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'

    如果 expr1expr2NULL,则此函数返回 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(expr)

    提取时间或日期时间表达式 expr 的时间部分,并将其作为字符串返回。如果 exprNULL,则返回 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(expr1,expr2)

    TIMEDIFF() 返回 expr1expr2,表示为时间值。 expr1expr2 是字符串,将被转换为 TIMEDATETIME 表达式;转换后,它们必须具有相同的类型。如果 expr1expr2NULL,则返回 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(expr)TIMESTAMP(expr1,expr2)

    如果只有一个参数,则此函数将日期或日期时间表达式 expr 作为日期时间值返回。如果包含两个参数,则将时间表达式 expr2 添加到日期或日期时间表达式 expr1,并将结果作为日期时间值返回。如果 exprexpr1expr2NULL,则返回 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(unit,interval,datetime_expr)

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

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

    如果 intervaldatetime_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'

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

    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(unit,datetime_expr1,datetime_expr2)

    返回 datetime_expr2datetime_expr1,其中 datetime_expr1datetime_expr2 是日期或日期时间表达式。一个表达式可以是日期,另一个表达式可以是日期时间;日期值被视为具有时间部分 '00:00:00' 的日期时间(如有必要)。结果(一个整数)的单位由 unit 参数给出。 unit 的合法值与 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(time,format)

    此函数的使用方式与 DATE_FORMAT() 函数相同,但 format 字符串可能仅包含小时、分钟、秒和微秒的格式说明符。其他说明符会生成 NULL0。如果 timeformatNULL,则 TIME_FORMAT() 返回 NULL

    如果 time 值包含大于 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(time)

    返回 time 参数,转换为秒。如果 timeNULL,则返回 NULL

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

    给定日期 date,返回一个天数(自公元 0 年以来的天数)。如果 dateNULL,则返回 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(expr)

    给定日期或日期时间 expr,返回自公元 0 年以来的秒数。如果 expr 不是有效的日期或日期时间值(包括 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])

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

    如果 UNIX_TIMESTAMP() 在有 date 参数的情况下被调用,它将返回该参数的值,表示自 '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()

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

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

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

    如果给出 fsp 参数以指定 0 到 6 之间的小数秒精度,则返回值将包含具有该位数的小数秒部分。

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

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

    如果给出 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 参数的工作原理。

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

    对于 mode 值,其含义为 这一年包含 4 天或更多天,” 周的编号方式符合 ISO 8601:1988 标准。

    • 如果包含 1 月 1 日的周在新年中有 4 天或更多天,则该周为第一周。

    • 否则,该周为前一年的最后一周,下一周为第一周。

    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 而不是 52,以便返回值为 给定年份中的周数。 这使得 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)

    返回 date 的年份,范围为 10009999,或对于 日期返回 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

    对于可选参数 01,周数与 WEEK() 函数返回的周数不同(0),因为 WEEK() 然后返回给定年份中的周数。