文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (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() 的同義詞
LOCALTIMESTAMPLOCALTIMESTAMP() 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() 假設其引數是工作階段時區中的 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()

支援 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() 會將日期時間值 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(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 值,且您的計算僅涉及 YEARMONTHDAY 部分(即沒有時間部分),則返回 DATE

    • 如果 date 引數為 TIME 值,且計算僅涉及 HOURSMINUTESSECONDS 部分(即沒有日期部分),則返回 TIME

    • 如果第一個引數為 DATETIME(或 TIMESTAMP)值,或者如果第一個引數為 DATEunit 值使用 HOURSMINUTESSECONDS,或者如果第一個引數的類型為 TIMEunit 值使用 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'

    當將 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 帶英文後綴的月份中的日期 (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 對於任何未在上面列出的「x」的 x

    由於 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])

    以 datetime 或字元字串值形式傳回 unix_timestamp 的表示法。返回的值使用會話時區表示。(用戶端可以如第 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'
    注意

    如果您使用 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 的月份,範圍為 1 到 12,分別表示一月到十二月,對於月份部分為零的日期(例如 '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 和一個格式字串 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.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(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 (微秒)、SECOND (秒)、MINUTE (分)、HOUR (時)、DAY (天)、WEEK (週)、MONTH (月)、QUARTER (季) 或 YEAR (年)。

    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 字串可能只包含小時、分鐘、秒和微秒的格式指定符。其他指定符會產生 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)

    給定日期或日期時間 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 引數,則會傳回一個表示自 '1970-01-01 00:00:00' UTC 以來秒數的 Unix 時間戳記。

    如果呼叫 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 位元平台,為 '1970-01-01 00:00:01.000000' UTC 至 '2038-01-19 03:14:07.999999' UTC;對於在 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       |
    +---------------------------+
    注意

    若要使用具名的時區(例如 '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 今年有星期一

    對於 mode 值,其含義為「今年有 4 天或更多天」,週數是根據 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)

    傳回 date 的年份,範圍在 10009999 之間,或對於「」日期,則傳回 0。如果 dateNULL,則傳回 NULL

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

    傳回日期的年份和週數。對於年份的第一週和最後一週,結果中的年份可能與日期參數中的年份不同。如果 dateNULL,則傳回 NULL

    mode 參數的運作方式與 WEEK()mode 參數完全相同。對於單參數語法,使用 0 的 mode 值。與 WEEK() 不同,default_week_format 的值不會影響 YEARWEEK()

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

    對於可選參數 01,週數與 WEEK() 函數將傳回的週數 (0) 不同,因為 WEEK() 然後會傳回給定年份的週數。