本節說明可用於操作時間值的函數。有關每個日期和時間類型的數值範圍以及可以指定數值的有效格式,請參閱第 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()
假設其引數是工作階段時區中的 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()
。
支援 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
。如果第一個引數是動態參數(例如,預處理語句的參數),則如果第二個引數是僅包含
YEAR
、MONTH
或DAY
值組合的間隔,則其解析類型為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
間隔加到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
])以 datetime 或字元字串值形式傳回
unix_timestamp
的表示法。返回的值使用會話時區表示。(用戶端可以如第 7.1.15 節「MySQL 伺服器時區支援」中所述設定會話時區。)unix_timestamp
是一個內部時間戳記值,表示自'1970-01-01 00:00:00'
UTC 以來的秒數,例如由UNIX_TIMESTAMP()
函式產生的秒數。如果省略
format
,則此函式返回DATETIME
值。如果
unix_timestamp
或format
為NULL
,則此函式返回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()
函數結合使用時很有用。如果
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()
的行為不同,後者傳回其執行的確切時間。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 節,「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
,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
(年)。unit
值可以使用如所示的關鍵字之一指定,也可以使用SQL_TSI_
前綴。例如,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()
在time
或format
為NULL
時會傳回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 節,「轉換函式和運算子」。以
'
或YYYY-MM-DD
'YYYYMMDD
格式傳回目前的 UTC 日期,具體取決於函式是在字串或數值內容中使用。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
參數完全相同。對於單參數語法,使用 0 的mode
值。與WEEK()
不同,default_week_format
的值不會影響YEARWEEK()
。mysql> SELECT YEARWEEK('1987-01-01'); -> 198652
對於可選參數
0
或1
,週數與WEEK()
函數將傳回的週數 (0
) 不同,因為WEEK()
然後會傳回給定年份的週數。