本節說明可用於操作時間值的函數。有關每個日期和時間類型的數值範圍以及可以指定數值的有效格式的說明,請參閱第 13.2 節「日期和時間資料類型」。
表 14.11 日期和時間函數
名稱 | 說明 |
---|---|
ADDDATE() |
將時間值 (間隔) 加入日期值 |
ADDTIME() |
加入時間 |
CONVERT_TZ() |
從一個時區轉換到另一個時區 |
CURDATE() |
傳回目前日期 |
CURRENT_DATE() 、CURRENT_DATE |
CURDATE() 的同義詞 |
CURRENT_TIME() 、CURRENT_TIME |
CURTIME() 的同義詞 |
CURRENT_TIMESTAMP() 、CURRENT_TIMESTAMP |
NOW() 的同義詞 |
CURTIME() |
傳回目前時間 |
DATE() |
擷取日期或日期時間表達式的日期部分 |
DATE_ADD() |
將時間值 (間隔) 加入日期值 |
DATE_FORMAT() |
將日期格式化為指定格式 |
DATE_SUB() |
從日期減去時間值 (間隔) |
DATEDIFF() |
減去兩個日期 |
DAY() |
DAYOFMONTH() 的同義詞 |
DAYNAME() |
傳回星期幾的名稱 |
DAYOFMONTH() |
傳回月份中的第幾天 (0-31) |
DAYOFWEEK() |
傳回參數的星期幾索引 |
DAYOFYEAR() |
傳回一年中的第幾天 (1-366) |
EXTRACT() |
擷取日期的一部分 |
FROM_DAYS() |
將天數轉換為日期 |
FROM_UNIXTIME() |
將 Unix 時間戳記格式化為日期 |
GET_FORMAT() |
傳回日期格式字串 |
HOUR() |
擷取小時 |
LAST_DAY |
傳回參數的月份的最後一天 |
LOCALTIME() 、LOCALTIME |
NOW() 的同義詞 |
LOCALTIMESTAMP 、LOCALTIMESTAMP() |
NOW() 的同義詞 |
MAKEDATE() |
從年份和一年中的第幾天建立日期 |
MAKETIME() |
從時、分、秒建立時間 |
MICROSECOND() |
從參數傳回微秒 |
MINUTE() |
從參數傳回分鐘 |
MONTH() |
從傳遞的日期傳回月份 |
MONTHNAME() |
傳回月份的名稱 |
NOW() |
傳回目前日期和時間 |
PERIOD_ADD() |
將期間加入年月份 |
PERIOD_DIFF() |
傳回期間之間的月份數 |
QUARTER() |
從日期參數傳回季度 |
SEC_TO_TIME() |
將秒轉換為 'hh:mm:ss' 格式 |
SECOND() |
傳回秒 (0-59) |
STR_TO_DATE() |
將字串轉換為日期 |
SUBDATE() |
當使用三個參數叫用時,DATE_SUB() 的同義詞 |
SUBTIME() |
減去時間 |
SYSDATE() |
傳回函數執行的時間 |
TIME() |
擷取傳遞的表達式中的時間部分 |
TIME_FORMAT() |
格式化為時間 |
TIME_TO_SEC() |
傳回轉換為秒的參數 |
TIMEDIFF() |
減去時間 |
TIMESTAMP() |
使用單一參數時,此函數會傳回日期或日期時間表達式;使用兩個參數時,會傳回參數總和 |
TIMESTAMPADD() |
將間隔加入日期時間表達式 |
TIMESTAMPDIFF() |
使用指定的單位傳回兩個日期時間表達式的差值 |
TO_DAYS() |
傳回轉換為天的日期參數 |
TO_SECONDS() |
傳回自第 0 年以來轉換為秒的日期或日期時間參數 |
UNIX_TIMESTAMP() |
傳回 Unix 時間戳記 |
UTC_DATE() |
傳回目前的 UTC 日期 |
UTC_TIME() |
傳回目前的 UTC 時間 |
UTC_TIMESTAMP() |
傳回目前的 UTC 日期和時間 |
WEEK() |
傳回週數 |
WEEKDAY() |
傳回星期幾索引 |
WEEKOFYEAR() |
傳回日期的行事曆週 (1-53) |
YEAR() |
傳回年份 |
YEARWEEK() |
傳回年份和週 |
以下範例會使用日期函數。以下查詢會選取所有 date_col
值在最近 30 天內的列
mysql> SELECT something FROM tbl_name
-> WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= date_col;
此查詢也會選取日期在未來的列。
預期日期值的函數通常會接受日期時間值,並忽略時間部分。預期時間值的函數通常會接受日期時間值,並忽略日期部分。
傳回目前日期或時間的函式,在查詢執行開始時,每個函式只會被評估一次。這表示在單一查詢中多次參考同一個函式(例如 NOW()
)時,永遠會產生相同的結果。(以我們的目的而言,單一查詢也包含對預存程式(預存常式、觸發程序或事件)及其所有子程式的呼叫。)此原則也適用於 CURDATE()
、CURTIME()
、UTC_DATE()
、UTC_TIME()
、UTC_TIMESTAMP()
以及它們的任何同義詞。
CURRENT_TIMESTAMP()
、CURRENT_TIME()
、CURRENT_DATE()
和 FROM_UNIXTIME()
函式會以目前的工作階段時區傳回值,該時區可作為 time_zone
系統變數的工作階段值。此外,UNIX_TIMESTAMP()
假設其引數是工作階段時區的日期時間值。請參閱第 7.1.15 節, 「MySQL 伺服器時區支援」。
某些日期函式可搭配「零」日期或不完整日期(例如 '2001-11-00'
)使用,而其他函式則無法。擷取日期部分的函式通常可搭配不完整日期使用,因此在您可能期望非零值的情況下,可能會傳回 0。例如:
mysql> SELECT DAYOFMONTH('2001-11-00'), MONTH('2005-00-00');
-> 0, 0
其他函式則期望完整的日期,並針對不完整的日期傳回 NULL
。這些函式包含執行日期算術或將日期部分對應到名稱的函式。例如:
mysql> SELECT DATE_ADD('2006-05-00',INTERVAL 1 DAY);
-> NULL
mysql> SELECT DAYNAME('2006-05-00');
-> NULL
當傳遞 DATE()
函式值作為引數時,有幾個函式會非常嚴格,並拒絕日期部分為零的不完整日期:CONVERT_TZ()
、DATE_ADD()
、DATE_SUB()
、DAYOFYEAR()
、TIMESTAMPDIFF()
、TO_DAYS()
、TO_SECONDS()
、WEEK()
、WEEKDAY()
、WEEKOFYEAR()
、YEARWEEK()
。
支援 TIME
、DATETIME
和 TIMESTAMP
值的秒數小數部分,精確度最高可達微秒。接受時間引數的函式會接受帶有秒數小數部分的值。時間函式的傳回值會視情況包含秒數小數部分。
ADDDATE(
、date
,INTERVALexpr
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'
如果
date
或days
為NULL
,則此函式會傳回NULL
。ADDTIME()
會將expr2
新增至expr1
,並傳回結果。expr1
是時間或日期時間運算式,而expr2
是時間運算式。如果expr1
或expr2
為NULL
,則會傳回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
指定的時區,並傳回產生的值。時區的指定方式請見第 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 伺服器時區支援」。以
'
或YYYY-MM-DD
'YYYYMMDD
格式傳回目前日期,具體取決於函式是用在字串還是數值內容中。mysql> SELECT CURDATE(); -> '2008-06-13' mysql> SELECT CURDATE() + 0; -> 20080613
CURRENT_DATE
和CURRENT_DATE()
是CURDATE()
的同義詞。CURRENT_TIME
、CURRENT_TIME([
fsp
])CURRENT_TIME
和CURRENT_TIME()
是CURTIME()
的同義詞。CURRENT_TIMESTAMP
、CURRENT_TIMESTAMP([
fsp
])CURRENT_TIMESTAMP
和CURRENT_TIMESTAMP()
是NOW()
的同義詞。以
'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 | +--------------+
擷取日期或日期時間運算式
expr
的日期部分。如果expr
為NULL
,則傳回NULL
。mysql> SELECT DATE('2003-12-31 01:02:03'); -> '2003-12-31'
DATEDIFF()
會傳回以天數表示的expr1
−expr2
值,即從一個日期到另一個日期之間的天數。expr1
和expr2
是日期或日期時間運算式。計算時只會使用值的日期部分。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
如果
expr1
或expr2
為NULL
,則此函式會傳回NULL
。DATE_ADD(
、date
,INTERVALexpr
unit
)DATE_SUB(
date
,INTERVALexpr
unit
)這些函式會執行日期算術。
date
引數會指定開始日期或日期時間值。expr
是一個運算式,指定要從開始日期新增或減去的間隔值。expr
會評估為字串;對於負間隔,它可以從-
開始。unit
是一個關鍵字,指示應該以什麼單位來解譯運算式。如需時間間隔語法的詳細資訊,包括
unit
指定子的完整清單、每個unit
值的expr
引數的預期格式,以及時間算術中運算元解譯的規則,請參閱時間間隔。傳回值取決於引數
如果
date
為NULL
,則此函式會傳回NULL
。如果
date
引數為DATE
值,且您的計算僅涉及YEAR
、MONTH
和DAY
部分(亦即,不包含時間部分),則傳回DATE
。如果
date
引數為TIME
值,且計算僅涉及HOURS
、MINUTES
和SECONDS
部分(亦即,不包含日期部分),則傳回TIME
。如果第一個引數為
DATETIME
(或TIMESTAMP
)值,或如果第一個引數為DATE
,且unit
值使用HOURS
、MINUTES
或SECONDS
,或如果第一個引數為TIME
類型,且unit
值使用YEAR
、MONTH
或DAY
,則傳回DATETIME
。如果第一個引數為動態參數(例如,預備陳述式),其解析類型為
DATE
,若第二個引數為僅包含YEAR
、MONTH
或DAY
值組合的間隔;否則其類型為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
間隔新增至DATE
或DATETIME
值,且產生的日期包含在給定月份中不存在的日期時,該日期會調整為該月份的最後一天,如下所示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)
根據
format
字串格式化date
值。如果任一引數為NULL
,則此函式會傳回NULL
。下表所示的指定符號可用於
format
字串中。格式指定符號字元之前必須要有%
字元。這些指定符號也適用於其他函式:STR_TO_DATE()
、TIME_FORMAT()
、UNIX_TIMESTAMP()
。指定符號 說明 %a
縮寫的星期名稱 ( Sun
..Sat
)%b
縮寫的月份名稱 ( Jan
..Dec
)%c
月份,數值 ( 0
..12
)%D
月份中的日期,附帶英文後綴 ( 0th
、1st
、2nd
、3rd
、…)%d
月份中的日期,數值 ( 00
..31
)%e
月份中的日期,數值 ( 0
..31
)%f
微秒 ( 000000
..999999
)%H
小時 ( 00
..23
)%h
小時 ( 01
..12
)%I
小時 ( 01
..12
)%i
分鐘,數值 ( 00
..59
)%j
一年中的日期 ( 001
..366
)%k
小時 ( 0
..23
)%l
小時 ( 1
..12
)%M
月份名稱 ( January
..December
)%m
月份,數值 ( 00
..12
)%p
AM
或PM
%r
時間,12 小時制 ( hh:mm:ss
後面跟著AM
或PM
)%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_connection
和collation_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
,INTERVALexpr
unit
)請參閱
DATE_ADD()
的描述。DAY()
是DAYOFMONTH()
的同義詞。傳回
date
的星期名稱。用於名稱的語言由lc_time_names
系統變數的值控制(請參閱 第 12.16 節「MySQL 伺服器地區設定支援」)。如果date
為NULL
,則傳回NULL
。mysql> SELECT DAYNAME('2007-02-03'); -> 'Saturday'
傳回
date
的月份中的日期,範圍為1
到31
,或對於具有零日期部分的日期(例如'0000-00-00'
或'2008-00-00'
)傳回0
。如果date
為NULL
,則傳回NULL
。mysql> SELECT DAYOFMONTH('2007-02-03'); -> 3
傳回
date
的星期索引 (1
= 星期日、2
= 星期一、…、7
= 星期六)。這些索引值與 ODBC 標準對應。如果date
為NULL
,則傳回NULL
。mysql> SELECT DAYOFWEEK('2007-02-03'); -> 7
傳回
date
的一年中的日期,範圍為1
到366
。如果date
為NULL
,則傳回NULL
。mysql> SELECT DAYOFYEAR('2007-02-03'); -> 34
EXTRACT()
函式使用與DATE_ADD()
或DATE_SUB()
相同種類的unit
指定符號,但會從日期中擷取部分,而非執行日期運算。如需unit
引數的資訊,請參閱時間間隔。如果date
為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
給定日數
N
,傳回DATE
值。如果N
為NULL
,則傳回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_timestamp
或format
為NULL
,則此函式會傳回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()
函式結合使用非常有用。如果
format
為NULL
,則此函式會傳回NULL
。第一個和第二個引數的可能值會產生數個可能的格式字串 (如需所用指定詞,請參閱
DATE_FORMAT()
函式說明中的表格)。ISO 格式是指 ISO 9075,而不是 ISO 8601。函式呼叫 結果 GET_FORMAT(DATE,'USA')
'%m.%d.%Y'
GET_FORMAT(DATE,'JIS')
'%Y-%m-%d'
GET_FORMAT(DATE,'ISO')
'%Y-%m-%d'
GET_FORMAT(DATE,'EUR')
'%d.%m.%Y'
GET_FORMAT(DATE,'INTERNAL')
'%Y%m%d'
GET_FORMAT(DATETIME,'USA')
'%Y-%m-%d %H.%i.%s'
GET_FORMAT(DATETIME,'JIS')
'%Y-%m-%d %H:%i:%s'
GET_FORMAT(DATETIME,'ISO')
'%Y-%m-%d %H:%i:%s'
GET_FORMAT(DATETIME,'EUR')
'%Y-%m-%d %H.%i.%s'
GET_FORMAT(DATETIME,'INTERNAL')
'%Y%m%d%H%i%s'
GET_FORMAT(TIME,'USA')
'%h:%i:%s %p'
GET_FORMAT(TIME,'JIS')
'%H:%i:%s'
GET_FORMAT(TIME,'ISO')
'%H:%i:%s'
GET_FORMAT(TIME,'EUR')
'%H.%i.%s'
GET_FORMAT(TIME,'INTERNAL')
'%H%i%s'
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'
傳回
time
的小時數。針對一天中的時間值,傳回值的範圍為0
到23
。但是,TIME
值的範圍實際上大得多,因此HOUR
可以傳回大於23
的值。如果time
為NULL
,則傳回NULL
。mysql> SELECT HOUR('10:05:03'); -> 10 mysql> SELECT HOUR('272:59:59'); -> 272
採用日期或日期時間值,並傳回對應的當月最後一天值。如果引數無效或
NULL
,則傳回NULL
。mysql> SELECT LAST_DAY('2003-02-05'); -> '2003-02-28' mysql> SELECT LAST_DAY('2004-02-05'); -> '2004-02-29' mysql> SELECT LAST_DAY('2004-01-01 01:01:01'); -> '2004-01-31' mysql> SELECT LAST_DAY('2003-03-32'); -> NULL
LOCALTIME
和LOCALTIME()
是NOW()
的同義詞。LOCALTIMESTAMP
、LOCALTIMESTAMP([
fsp
])LOCALTIMESTAMP
和LOCALTIMESTAMP()
是NOW()
的同義詞。傳回日期,指定年份和一年中的日期值。
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
傳回從
hour
、minute
和second
引數計算的時間值。如果任何引數為NULL
,則傳回NULL
。second
引數可以有小數部分。mysql> SELECT MAKETIME(12,15,30); -> '12:15:30'
傳回時間或日期時間運算式
expr
的微秒數,範圍為0
到999999
。如果expr
為NULL
,則傳回NULL
。mysql> SELECT MICROSECOND('12:00:00.123456'); -> 123456 mysql> SELECT MICROSECOND('2019-12-31 23:59:59.000010'); -> 10
傳回
time
的分鐘數,範圍為0
到59
,如果time
為NULL
,則傳回NULL
。mysql> SELECT MINUTE('2008-02-03 10:05:03'); -> 5
傳回
date
的月份,範圍為 1 到 12 (一月到十二月),對於具有零月份部分的日期 (例如'0000-00-00'
或'2008-00-00'
),則傳回0
。如果date
為NULL
,則傳回NULL
。mysql> SELECT MONTH('2008-02-03'); -> 2
傳回
date
的月份全名。用於名稱的語言由lc_time_names
系統變數的值控制 (第 12.16 節「MySQL 伺服器地區設定支援」)。如果date
為NULL
,則傳回NULL
。mysql> SELECT MONTHNAME('2008-02-03'); -> 'February'
以
'
或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()
的說明。將
N
個月新增至期間P
(格式為YYMM
或YYYYMM
)。傳回YYYYMM
格式的值。注意期間引數
P
不是日期值。如果
P
或N
為NULL
,則此函式會傳回NULL
。mysql> SELECT PERIOD_ADD(200801,2); -> 200803
傳回期間
P1
和P2
之間的月數。P1
和P2
的格式應為YYMM
或YYYYMM
。請注意,期間參數P1
和P2
不是日期值。如果
P1
或P2
為NULL
,此函式會傳回NULL
。mysql> SELECT PERIOD_DIFF(200802,200703); -> 11
傳回
date
的年份季度,範圍為1
到4
,如果date
為NULL
,則傳回NULL
。mysql> SELECT QUARTER('2008-04-01'); -> 2
傳回
time
的秒數,範圍為0
到59
,如果time
為NULL
,則傳回NULL
。mysql> SELECT SECOND('10:05:03'); -> 3
將
seconds
參數轉換為小時、分鐘和秒數,並以TIME
值傳回。結果的範圍限制為TIME
資料類型。如果參數對應到該範圍之外的值,則會產生警告。如果
seconds
為NULL
,則此函式會傳回NULL
。mysql> SELECT SEC_TO_TIME(2378); -> '00:39:38' mysql> SELECT SEC_TO_TIME(2378) + 0; -> 3938
這是
DATE_FORMAT()
函式的反向操作。它會接收字串str
和格式字串format
。如果格式字串包含日期和時間部分,則STR_TO_DATE()
會傳回DATETIME
值;如果字串僅包含日期或時間部分,則傳回DATE
或TIME
值。如果str
或format
為NULL
,則此函式會傳回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
,INTERVALexpr
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
,並以與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'
如果
expr1
或expr2
為NULL
,則此函式會傳回NULL
。根據函式是在字串或數值內容中使用,以
'
或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()
的不確定性也表示索引不能用於評估引用它的運算式。擷取時間或日期時間運算式
expr
的時間部分,並以字串形式傳回。如果expr
為NULL
,則傳回NULL
。此函式對於基於語句的複寫是不安全的。如果將
binlog_format
設定為STATEMENT
,則使用此函式時會記錄警告。mysql> SELECT TIME('2003-12-31 01:02:03'); -> '01:02:03' mysql> SELECT TIME('2003-12-31 01:02:03.000123'); -> '01:02:03.000123'
TIMEDIFF()
傳回expr1
−expr2
的時間值結果。expr1
和expr2
為字串,會被轉換為TIME
或DATETIME
表達式;轉換後必須為相同類型。若expr1
或expr2
為NULL
,則傳回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
,並將結果作為日期時間值傳回。若expr
、expr1
或expr2
為NULL
,則傳回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_expr
。interval
的單位由unit
參數給定,應該是以下值之一:MICROSECOND
(微秒)、SECOND
、MINUTE
、HOUR
、DAY
、WEEK
、MONTH
、QUARTER
或YEAR
。可以使用如上所示的關鍵字或帶有
SQL_TSI_
前綴來指定unit
值。例如,DAY
和SQL_TSI_DAY
都是合法的。如果
interval
或datetime_expr
為NULL
,此函數會傳回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
間隔新增至DATE
或DATETIME
值,且產生的日期包含在給定月份中不存在的日期時,該日期會調整為該月份的最後一天,如下所示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_expr2
−datetime_expr1
,其中datetime_expr1
和datetime_expr2
是日期或日期時間表達式。其中一個表達式可以是日期,另一個可以是日期時間;如有必要,日期值會被視為時間部分為'00:00:00'
的日期時間。結果(整數)的單位由unit
參數給定。unit
的合法值與TIMESTAMPADD()
函數的描述中列出的值相同。如果
datetime_expr1
或datetime_expr2
為NULL
,此函數會傳回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()
函數時使用的順序相反。此函數的使用方式與
DATE_FORMAT()
函數類似,但format
字串只能包含小時、分鐘、秒和微秒的格式指定符。其他指定符會產生NULL
或0
。如果time
或format
為NULL
,TIME_FORMAT()
會傳回NULL
。如果
time
值包含大於23
的小時部分,則%H
和%k
小時格式指定符會產生大於0..23
通常範圍的值。其他小時格式指定符會產生模數為 12 的小時值。mysql> SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l'); -> '100 100 04 04 4'
傳回轉換為秒的
time
參數。如果time
為NULL
,則傳回NULL
。mysql> SELECT TIME_TO_SEC('22:23:00'); -> 80580 mysql> SELECT TIME_TO_SEC('00:39:38'); -> 2378
給定日期
date
,會傳回天數(自 0 年以來的天數)。如果date
為NULL
,則傳回NULL
。mysql> SELECT TO_DAYS(950501); -> 728779 mysql> SELECT TO_DAYS('2007-10-07'); -> 733321
TO_DAYS()
不適用於格里高利曆(1582 年)之前的日期值,因為它沒有考慮到日曆變更時失去的天數。對於 1582 年之前的日期(以及其他地區中可能較晚的年份),此函數的結果不可靠。如需詳細資訊,請參閱第 13.2.7 節「MySQL 使用哪種日曆?」。請記住,MySQL 會使用第 13.2 節「日期和時間資料類型」中的規則,將日期中的兩位數年份值轉換為四位數形式。例如,
'2008-10-07'
和'08-10-07'
會被視為相同的日期。mysql> SELECT TO_DAYS('2008-10-07'), TO_DAYS('08-10-07'); -> 733687, 733687
在 MySQL 中,零日期定義為
'0000-00-00'
,即使此日期本身被視為無效。這表示對於'0000-00-00'
和'0000-01-01'
,TO_DAYS()
會傳回這裡顯示的值。mysql> SELECT TO_DAYS('0000-00-00'); +-----------------------+ | to_days('0000-00-00') | +-----------------------+ | NULL | +-----------------------+ 1 row in set, 1 warning (0.00 sec) mysql> SHOW WARNINGS; +---------+------+----------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------+ | Warning | 1292 | Incorrect datetime value: '0000-00-00' | +---------+------+----------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT TO_DAYS('0000-01-01'); +-----------------------+ | to_days('0000-01-01') | +-----------------------+ | 1 | +-----------------------+ 1 row in set (0.00 sec)
無論是否啟用
ALLOW_INVALID_DATES
SQL 伺服器模式,都是如此。給定日期或日期時間
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
參數,則它會傳回表示自'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
參數可以是DATE
、DATETIME
或TIMESTAMP
字串,或是YYMMDD
、YYMMDDhhmmss
、YYYYMMDD
或YYYYMMDDhhmmss
格式的數字。如果參數包含時間部分,則可以選擇性地包含小數秒部分。如果未給定任何參數,或是參數不包含小數秒部分,則傳回值為整數;如果給定包含小數秒部分的參數,則傳回值為
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
。如果date
為NULL
,則傳回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 日期,格式為
'
或YYYY-MM-DD
'YYYYMMDD
,具體取決於該函數是在字串或數值上下文中使用。mysql> SELECT UTC_DATE(), UTC_DATE() + 0; -> '2003-08-14', 20030814
以
'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
此函數傳回
date
的週數。WEEK()
的雙參數形式可讓您指定週的開始是星期天還是星期一,以及傳回值應該在0
到53
還是1
到53
的範圍內。如果省略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
如果日期落在前一年的最後一週,如果您不使用
2
、3
、6
或7
作為可選的mode
參數,則 MySQL 會傳回0
mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0); -> 2000, 0
有人可能會認為
WEEK()
應該傳回52
,因為給定的日期實際上發生在 1999 年的第 52 週。WEEK()
改為傳回0
,以便傳回值為 「給定年份中的週數。」 當與從日期中提取日期部分的其他函數組合使用時,這使得WEEK()
函數可靠。如果您希望根據給定日期一週的第一天所在的年份評估結果,請使用
0
、2
、5
或7
作為可選的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'
傳回
date
的星期索引 (0
= 星期一、1
= 星期二、...6
= 星期天)。如果date
是NULL
,則傳回NULL
。mysql> SELECT WEEKDAY('2008-02-03 22:23:00'); -> 6 mysql> SELECT WEEKDAY('2007-11-06'); -> 1
傳回日期的日曆週數,範圍為
1
到53
。如果date
是NULL
,則傳回NULL
。WEEKOFYEAR()
是一個相容性函數,等同於WEEK(
。date
,3)mysql> SELECT WEEKOFYEAR('2008-02-20'); -> 8
傳回
date
的年份,範圍為1000
到9999
,或 「零」 日期的0
。如果date
是NULL
,則傳回NULL
。mysql> SELECT YEAR('1987-01-01'); -> 1987
YEARWEEK(
,date
)YEARWEEK(
date
,mode
)傳回日期的年份和週數。結果中的年份可能與一年中的第一週和最後一週的日期參數中的年份不同。如果
date
是NULL
,則傳回NULL
。mode
參數的工作方式與WEEK()
的mode
參數完全相同。對於單參數語法,會使用mode
值 0。與WEEK()
不同,default_week_format
的值不會影響YEARWEEK()
。mysql> SELECT YEARWEEK('1987-01-01'); -> 198652
對於可選參數
0
或1
,週數與WEEK()
函數會傳回的值 (0
) 不同,因為WEEK()
接著會傳回給定年份的週數。