文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (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() 擷取日期或日期時間表達式的日期部分
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() 假設其引數是工作階段時區的日期時間值。請參閱第 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)值,或如果第一個引數為 DATE,且 unit 值使用 HOURSMINUTESSECONDS,或如果第一個引數為 TIME 類型,且 unit 值使用 YEARMONTHDAY,則傳回 DATETIME

    • 如果第一個引數為動態參數(例如,預備陳述式),其解析類型為 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 月份中的日期,附帶英文後綴 (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])

    傳回 unix_timestamp 的日期時間或字串值表示。傳回的值使用工作階段時區表示。(客戶端可以設定工作階段時區,如第 7.1.15 節「MySQL 伺服器時區支援」所述。) unix_timestamp 是一個內部時間戳記值,表示自 UTC 時間的 '1970-01-01 00:00:00' 以來的秒數,例如 UNIX_TIMESTAMP() 函式所產生。

    如果省略 format,則此函式會傳回 DATETIME 值。

    如果 unix_timestampformatNULL,則此函式會傳回 NULL

    如果 unix_timestamp 是整數,則 DATETIME 的小數秒精度為零。當 unix_timestamp 是十進位值時,DATETIME 的小數秒精度與十進位值的精度相同,最高可達 6。當 unix_timestamp 是浮點數時,日期時間的小數秒精度為 6。

    在 32 位元平台上,unix_timestamp 的最大可用值為 2147483647.999999,傳回 '2038-01-19 03:14:07.999999' UTC。在 64 位元平台上,有效最大值為 32536771199.999999,傳回 '3001-01-18 23:59:59.999999' UTC。無論平台或版本為何,大於有效最大值的 unix_timestamp 值都會傳回 0

    format 用於格式化結果,方式與 DATE_FORMAT() 函式使用的格式字串相同。如果提供 format,則傳回的值為 VARCHAR

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

    如果您使用 UNIX_TIMESTAMP()FROM_UNIXTIME() 在非 UTC 時區的值和 Unix 時間戳記值之間轉換,則轉換是有損的,因為映射在兩個方向都不是一對一的。如需詳細資訊,請參閱 UNIX_TIMESTAMP() 函式的說明。

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

    傳回格式字串。此函式與 DATE_FORMAT()STR_TO_DATE() 函式結合使用非常有用。

    如果 formatNULL,則此函式會傳回 NULL

    第一個和第二個引數的可能值會產生數個可能的格式字串 (如需所用指定詞,請參閱 DATE_FORMAT() 函式說明中的表格)。ISO 格式是指 ISO 9075,而不是 ISO 8601。

    TIMESTAMP 也可以用作 GET_FORMAT() 的第一個引數,在這種情況下,該函式傳回與 DATETIME 相同的值。

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

    傳回 time 的小時數。針對一天中的時間值,傳回值的範圍為 023。但是,TIME 值的範圍實際上大得多,因此 HOUR 可以傳回大於 23 的值。如果 timeNULL,則傳回 NULL

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

    採用日期或日期時間值,並傳回對應的當月最後一天值。如果引數無效或 NULL,則傳回 NULL

    mysql> SELECT LAST_DAY('2003-02-05');
            -> '2003-02-28'
    mysql> SELECT LAST_DAY('2004-02-05');
            -> '2004-02-29'
    mysql> SELECT LAST_DAY('2004-01-01 01:01:01');
            -> '2004-01-31'
    mysql> SELECT LAST_DAY('2003-03-32');
            -> NULL
  • 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() 的行為不同,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 節「日期、日期時間和時間戳記類型」所述。這表示,例如,除非 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 的範圍內(含 0 和 9999),檢查月份是否在 1-12 的範圍內(含 1 和 12),並檢查日是否在 1-31 的範圍內(含 1 和 31),但伺服器不會檢查這些值的組合。例如,SELECT STR_TO_DATE('23-2-31', '%Y-%m-%d') 會傳回 2023-02-31。啟用或停用 ALLOW_INVALID_DATES 伺服器 SQL 模式對此行為沒有影響。如需詳細資訊,請參閱第 13.2.2 節「日期、日期時間和時間戳記類型」

  • 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

    可以使用如上所示的關鍵字或帶有 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
    注意

    此函數的日期或日期時間參數順序與使用 2 個參數呼叫 TIMESTAMP() 函數時使用的順序相反。

  • TIME_FORMAT(time,format)

    此函數的使用方式與 DATE_FORMAT() 函數類似,但 format 字串只能包含小時、分鐘、秒和微秒的格式指定符。其他指定符會產生 NULL0。如果 timeformatNULLTIME_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 參數,則它會傳回表示自 '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()

    傳回目前的 UTC 日期,格式為 'YYYY-MM-DD'YYYYMMDD,具體取決於該函數是在字串或數值上下文中使用。

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

    'hh:mm:ss'hhmmss 格式傳回目前的 UTC 時間值,具體格式取決於函數是在字串還是數值上下文中使用。

    如果指定 fsp 引數來指定秒數小數精確度(從 0 到 6),則傳回值會包含指定位數的秒數小數部分。

    mysql> SELECT UTC_TIME(), UTC_TIME() + 0;
            -> '18:07:53', 180753.000000
  • UTC_TIMESTAMP, UTC_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 參數完全相同。對於單參數語法,會使用 mode 值 0。與 WEEK() 不同,default_week_format 的值不會影響 YEARWEEK()

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

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