本節說明可用於操作時間值的函數。有關每個日期和時間類型的數值範圍以及可以指定數值的有效格式,請參閱第 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,INTERVALexprunit)ADDDATE(date,days)當使用第二個引數的
INTERVAL形式叫用時,ADDDATE()是DATE_ADD()的同義詞。相關函式SUBDATE()是DATE_SUB()的同義詞。如需INTERVALunit引數的資訊,請參閱時間間隔。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; -> 20080613CURRENT_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,INTERVALexprunit)DATE_SUB(date,INTERVALexprunit)這些函式會執行日期算術。
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)%pAM或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,INTERVALexprunit)請參閱
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'); -> 34EXTRACT()函式使用與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'); -> NULLLOCALTIME和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.000000NOW()傳回一個常數時間,表示陳述式開始執行的時間。(在預存函數或觸發程序中,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_DATESQL 模式,則不允許使用零日期。在這種情況下,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,INTERVALexprunit)SUBDATE(expr,days)當以第二個引數的
INTERVAL形式叫用時,SUBDATE()是DATE_SUB()的同義字。有關INTERVALunit引數的資訊,請參閱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'); -> 733321TO_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_DATESSQL 伺服器模式,情況皆是如此。給定日期或日期時間
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_DATESSQL 伺服器模式,情況皆是如此。如果呼叫
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.000000UTC_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 會傳回0mysql> 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'); -> 1987YEARWEEK(、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()然後會傳回給定年份的週數。