Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  Functions and Operators  /  Date and Time Functions

14.7 日期和时间函数

本节描述了可以用来操作时间值的函数。请参阅第 13.2 节,“日期和时间数据类型”,了解每种日期和时间类型的值范围和有效格式。

表 14.11 日期和时间函数

Name Description
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() 将日期或datetime参数转换为自Year 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() 假设其参数是一个 datetime 值,在会话时间区中。请参阅 第 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()

时间、日期时间和时间戳值支持小数秒,精度高达微秒。接受时间参数的函数也接受小数秒值。从时间函数返回的值也包括小数秒。

  • ADDDATE(日期,INTERVAL expr 单位), 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 将其视为要添加到 expr 的整数天数。

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

    该函数返回 NULL 如果 datedaysNULL

  • ADDTIME(expr1,expr2)

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

    该函数和 SUBTIME() 函数的返回类型是根据以下规则确定的:

    • 如果第一个参数是动态参数(例如,在 prepared 语句中),则返回类型是 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'
    Note

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

  • CURDATE()

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

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

    CURRENT_DATECURRENT_DATE()CURDATE() 的同义词。

  • CURRENT_TIME, CURRENT_TIME([fsp])

    CURRENT_TIMECURRENT_TIME()CURTIME() 的同义词。

  • CURRENT_TIMESTAMP, CURRENT_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

    • 如果第一个参数是一个动态参数(例如,prepared 语句),其解析类型是 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(日期,格式)

    根据 日期 值和 格式 字符串格式化日期。如果两个参数中的任何一个是 NULL,则函数返回 NULL

    以下表格中的指定符可以在 格式 字符串中使用。% 字符在格式指定符之前是必需的。这些指定符也适用于其他函数:STR_TO_DATE()TIME_FORMAT()UNIX_TIMESTAMP()

    Specifier Description
    %a 缩写的星期名称 (..)
    %b 缩写的月份名称 (一月..十二月)
    %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 月份名称 (一月..十二月)
    %m 月份,数字 (00..12)
    %p 上午下午
    %r 时间,12小时 (hh:mm:ss followed by 上午 or 下午)
    %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 星期名称 (星期天..星期六)
    %w 星期几 (0=星期天..6=星期六)
    %X 星期年份,其中星期天是第一天,数字,四位数字;用于 %V
    %x 星期年份,其中星期一是第一天,数字,四位数字;用于 %v
    %Y 年份,数字,四位数字
    %y 年份,数字(两位数字)
    %% 一个文字 % 字符
    %x x,对于任何未列出的 x

    由于 MySQL 允许存储不完整的日期,例如 '2014-00-00',因此月份和日份specifier 的范围从零开始。

    用于日和月份名称和缩写的语言由 lc_time_names 系统变量控制(见 第 12.16 节,“MySQL 服务器语言支持”)。

    对于 %U%u%V%v specifier,请参阅 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(日期)

    返回 日期 的月份中的天数,在 131 之间的范围内,或者对于日期如 '0000-00-00''2008-00-00' 这样的日期,返回 0。如果 日期NULL,则返回 NULL

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

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

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

    返回 日期 的年份中的天数,在 1366 之间的范围内。如果 日期NULL,则返回 NULL

    mysql> SELECT DAYOFYEAR('2007-02-03');
            -> 34
  • EXTRACT(单位 FROM 日期)

    EXTRACT() 函数使用与 DATE_ADD()DATE_SUB() 相同的 单位 规范,但从日期中提取部分,而不是执行日期算术。有关 单位 参数的信息,请参阅 时间间隔。如果 日期NULL,则返回 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 的 datetime 或字符字符串值。返回的值使用会话时区表示。(客户端可以按照 第 7.1.15 节,“MySQL 服务器时区支持” 中所述设置会话时区。)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 是浮点数时,datetime 的小数秒精度为 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'
    Note

    如果您使用 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 也可以用作 获取格式() 的第一个参数,在这种情况下,函数返回与 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'
  • 小时(time)

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

    mysql> SELECT HOUR('10:05:03');
            -> 10
    mysql> SELECT HOUR('272:59:59');
            -> 272
  • 月末日(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
  • 本地时间, 本地时间([fsp])

    本地时间LOCALTIME()NOW() 的同义词。

  • 本地时间戳, LOCALTIMESTAMP([fsp])

    本地时间戳LOCALTIMESTAMP()NOW() 的同义词。

  • MAKEDATE(,天数)

    返回给定年份和天数值的日期。天数 必须大于 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(小时,分钟,)

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

    参数 可以有小数部分。

    mysql> SELECT MAKETIME(12,15,30);
            -> '12:15:30'
  • 微秒(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(时间)

    返回 时间 的分钟数,范围从 059,或如果 时间NULL,则返回 NULL

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

    返回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 服务器 Locale 支持”)。如果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() 的行为不同,后者返回 exact 执行时间。

    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 格式。

    Note

    期限参数 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 和一个格式字符串 formatSTR_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 类型” 所述。这意味着,例如,“零”日期或日期部分值为 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.2.0(和后续创新版本)中,STR_TO_DATE() 执行完整的范围检查,如果转换后的日期无效,将引发错误。

    Note

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

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

    您也应该注意,对于日期和datetime值的日期部分,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节,“日期、DATETIME和TIMESTAMP类型”,以获取更多信息。

  • SUBDATE(日期,INTERVAL expr unit), SUBDATE(expr,)

    当使用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'

    第二种形式启用了使用整数值。在这种情况下,它被解释为从日期或datetime表达式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是一个时间或datetime表达式,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)

    使用单个参数时,该函数将日期或datetime表达式 expr 作为datetime值返回。使用两个参数时,它将时间表达式 expr2 添加到日期或datetime表达式 expr1 并将结果作为datetime值返回。如果 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表达式 datetime_exprinterval 的单位由 unit 参数指定,应该是以下值之一:MICROSECOND(微秒)、SECONDMINUTEHOURDAYWEEKMONTHQUARTERYEAR

    可以使用关键字或带有 SQL_TSI_ 前缀来指定 unit 值。例如,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
    Note

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

  • TIME_FORMAT(time,format)

    这与 DATE_FORMAT() 函数类似,但 format 字符串只能包含小时、分钟、秒和微秒的格式说明符。其他说明符将产生 NULL0TIME_FORMAT() 如果 timeformatNULL,则返回 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)

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

    如果 UNIX_TIMESTAMP() 不带参数调用,它将返回一个 Unix 时间戳,表示从 '1970-01-01 00:00:00' UTC 开始的秒数。

    如果 UNIX_TIMESTAMP() 带有一个 日期 参数,它将返回参数的值作为从 '1970-01-01 00:00:00' UTC 开始的秒数。服务器将 日期 解释为会话时区中的值,并将其转换为 UTC 的内部 Unix 时间戳值。(客户端可以按照 第 7.1.15 节,“MySQL 服务器时区支持” 中所述设置会话时区。)日期 参数可以是一个 DATEDATETIMETIMESTAMP 字符串,或者是一个 YYMMDDYYMMDDhhmmssYYYYMMDDYYYYMMDDhhmmss 格式的数字。如果参数包括时间部分,可以选择性地包括小数秒部分。

    如果不提供参数或参数不包括小数秒部分,返回值是一个整数;否则,如果参数包括小数秒部分,返回值是一个 DECIMAL

    date 参数是一个 TIMESTAMP 列时,UNIX_TIMESTAMP() 直接返回内部时间戳值,无需隐式 字符串到 Unix 时间戳”” 转换。

    有效的参数值范围与 TIMESTAMP 数据类型相同:'1970-01-01 00:00:01.000000' UTC 到 '2038-01-19 03:14:07.999999' UTC 对于 32 位平台;对于在 64 位平台上运行的 MySQL,UNIX_TIMESTAMP() 的有效参数值范围是 '1970-01-01 00:00:01.000000' UTC 到 '3001-01-19 03:14:07.999999' UTC(对应于 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       |
    +---------------------------+
    Note

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

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

  • UTC_DATE, UTC_DATE()

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

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

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

    如果提供了 fsp 参数以指定小数秒精度从 0 到 6,则返回值将包括该精度的小数秒部分。

    mysql> SELECT UTC_TIME(), UTC_TIME() + 0;
            -> '18:07:53', 180753.000000
  • UTC_TIMESTAMP, UTC_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 参数的工作方式。

    Mode First day of week Range Week 1 is the first week …
    0 星期天 0-53 今年星期天
    1 星期一 0-53 今年四天或更多天
    2 星期天 1-53 今年星期天
    3 星期一 1-53 今年四天或更多天
    4 星期天 0-53 今年四天或更多天
    5 星期一 0-53 今年星期一
    6 星期天 1-53 今年四天或更多天
    7 星期一 1-53 今年星期一

    对于 mode 值具有“今年四天或更多天”的含义,周数将根据 ISO 8601:1988 编号:

    • 如果包含 1 月 1 日的周有四天或更多天在新的一年中,它是周 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

    如果日期落在前一年的最后一周,MySQL 将返回 0,如果您不使用 2367 作为可选的 mode 参数:

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

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

    如果您prefer 结果根据包含给定日期的第一天的年份进行评估,请使用 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

    周号与 WEEK() 函数返回的周号不同(0),因为 WEEK() 在给定年份的上下文中返回周号。