日期和時間值可以用幾種格式表示,例如帶引號的字串或數字,具體取決於值的確切類型和其他因素。例如,在 MySQL 預期日期的地方,它會將 '2015-07-21'
、'20150721'
和 20150721
都解讀為日期。
本節說明日期和時間常值可接受的格式。有關時間資料類型(例如允許值的範圍)的詳細資訊,請參閱 第 13.2 節「日期和時間資料類型」。
標準 SQL 要求使用類型關鍵字和字串指定時間常值。關鍵字和字串之間的空格是可選的。
DATE 'str'
TIME 'str'
TIMESTAMP 'str'
MySQL 會識別類型關鍵字,但與標準 SQL 不同的是,並非必要。要符合標準的應用程式應包含時間常值的類型關鍵字。
MySQL 還會識別與標準 SQL 語法對應的 ODBC 語法。
{ d 'str' }
{ t 'str' }
{ ts 'str' }
MySQL 使用類型關鍵字和 ODBC 結構來產生 DATE
、TIME
和 DATETIME
值,如果指定了,還包括尾隨的小數秒部分。 TIMESTAMP
語法會在 MySQL 中產生一個 DATETIME
值,因為 DATETIME
的範圍更符合標準 SQL TIMESTAMP
類型,後者的年份範圍從 0001
到 9999
。(MySQL TIMESTAMP
的年份範圍是 1970
到 2038
。)
MySQL 可辨識下列格式的 DATE
值。
以
'
或YYYY-MM-DD
''
格式的字串。允許使用「寬鬆」語法,但已棄用:任何標點符號字元都可用作日期部分之間的分隔符號。例如,YY-MM-DD
''2012-12-31'
、'2012/12/31'
、'2012^12^31'
和'2012@12@31'
是等效的。使用破折號 (-
) 以外的任何字元作為分隔符號會產生警告,如下所示mysql> SELECT DATE'2012@12@31'; +------------------+ | DATE'2012@12@31' | +------------------+ | 2012-12-31 | +------------------+ 1 row in set, 1 warning (0.00 sec) mysql> SHOW WARNINGS\G *************************** 1. row *************************** Level: Warning Code: 4095 Message: Delimiter '@' in position 4 in datetime value '2012@12@31' at row 1 is deprecated. Prefer the standard '-'. 1 row in set (0.00 sec)
以
'
或YYYYMMDD
''
格式的無分隔符號的字串,前提是該字串作為日期有意義。例如,YYMMDD
''20070523'
和'070523'
會被解讀為'2007-05-23'
,但'071332'
是非法的(它的月份和日期部分無意義),並會變成'0000-00-00'
。以
YYYYMMDD
或YYMMDD
格式的數字,前提是該數字作為日期有意義。例如,19830905
和830905
會被解讀為'1983-09-05'
。
MySQL 可辨識下列格式的 DATETIME
和 TIMESTAMP
值。
以
'
或YYYY-MM-DD hh:mm:ss
''
格式的字串。MySQL 也允許這裡使用「寬鬆」語法,儘管已棄用:任何標點符號字元都可用作日期部分或時間部分之間的分隔符號。例如,YY-MM-DD hh:mm:ss
''2012-12-31 11:30:45'
、'2012^12^31 11+30+45'
、'2012/12/31 11*30*45'
和'2012@12@31 11^30^45'
是等效的。在此類值中使用破折號 (-
) 作為日期部分的分隔符號和冒號 (:
) 作為時間部分的分隔符號以外的任何字元,都會產生警告,如下所示mysql> SELECT TIMESTAMP'2012^12^31 11*30*45'; +--------------------------------+ | TIMESTAMP'2012^12^31 11*30*45' | +--------------------------------+ | 2012-12-31 11:30:45 | +--------------------------------+ 1 row in set, 1 warning (0.00 sec) mysql> SHOW WARNINGS\G *************************** 1. row *************************** Level: Warning Code: 4095 Message: Delimiter '^' in position 4 in datetime value '2012^12^31 11*30*45' at row 1 is deprecated. Prefer the standard '-'. 1 row in set (0.00 sec)
日期和時間部分與小數秒部分之間唯一可識別的分隔符號是小數點。
日期和時間部分可以用
T
而不是空格分隔。例如,'2012-12-31 11:30:45'
'2012-12-31T11:30:45'
是等效的。先前,MySQL 支援日期和時間值中以及
DATETIME
和TIMESTAMP
值的日期和時間部分之間使用任意數量的開頭和結尾空白字元。在 MySQL 8.4 中,此行為已棄用,並且存在多餘的空白字元會觸發警告,如下所示mysql> SELECT TIMESTAMP'2012-12-31 11-30-45'; +----------------------------------+ | TIMESTAMP'2012-12-31 11-30-45' | +----------------------------------+ | 2012-12-31 11:30:45 | +----------------------------------+ 1 row in set, 1 warning (0.00 sec) mysql> SHOW WARNINGS\G *************************** 1. row *************************** Level: Warning Code: 4096 Message: Delimiter ' ' in position 11 in datetime value '2012-12-31 11-30-45' at row 1 is superfluous and is deprecated. Please remove. 1 row in set (0.00 sec)
當使用空格字元以外的空白字元時,也會產生警告,如下所示
mysql> SELECT TIMESTAMP'2021-06-06 '> 11:15:25'; +--------------------------------+ | TIMESTAMP'2021-06-06 11:15:25' | +--------------------------------+ | 2021-06-06 11:15:25 | +--------------------------------+ 1 row in set, 1 warning (0.00 sec) mysql> SHOW WARNINGS\G *************************** 1. row *************************** Level: Warning Code: 4095 Message: Delimiter '\n' in position 10 in datetime value '2021-06-06 11:15:25' at row 1 is deprecated. Prefer the standard ' '. 1 row in set (0.00 sec)
每個時間值只會產生一個此類警告,即使分隔符號、空白或兩者都可能存在多個問題,如下列一系列陳述式所示
mysql> SELECT TIMESTAMP'2012!-12-31 11:30:45'; +----------------------------------+ | TIMESTAMP'2012!-12-31 11:30:45' | +----------------------------------+ | 2012-12-31 11:30:45 | +----------------------------------+ 1 row in set, 1 warning (0.00 sec) mysql> SHOW WARNINGS\G *************************** 1. row *************************** Level: Warning Code: 4095 Message: Delimiter '!' in position 4 in datetime value '2012!-12-31 11:30:45' at row 1 is deprecated. Prefer the standard '-'. 1 row in set (0.00 sec) mysql> SELECT TIMESTAMP'2012-12-31 11:30:45'; +---------------------------------+ | TIMESTAMP'2012-12-31 11:30:45' | +---------------------------------+ | 2012-12-31 11:30:45 | +---------------------------------+ 1 row in set, 1 warning (0.00 sec) mysql> SHOW WARNINGS\G *************************** 1. row *************************** Level: Warning Code: 4096 Message: Delimiter ' ' in position 11 in datetime value '2012-12-31 11:30:45' at row 1 is superfluous and is deprecated. Please remove. 1 row in set (0.00 sec) mysql> SELECT TIMESTAMP'2012-12-31 11:30:45'; +--------------------------------+ | TIMESTAMP'2012-12-31 11:30:45' | +--------------------------------+ | 2012-12-31 11:30:45 | +--------------------------------+ 1 row in set (0.00 sec)
以
'
或YYYYMMDDhhmmss
''
格式的無分隔符號的字串,前提是該字串作為日期有意義。例如,YYMMDDhhmmss
''20070523091528'
和'070523091528'
會被解讀為'2007-05-23 09:15:28'
,但'071122129015'
是非法的(它的分鐘部分無意義),並會變成'0000-00-00 00:00:00'
。以
YYYYMMDDhhmmss
或YYMMDDhhmmss
格式的數字,前提是該數字作為日期有意義。例如,19830905132800
和830905132800
會被解讀為'1983-09-05 13:28:00'
。
DATETIME
或 TIMESTAMP
值可以包含尾隨的小數秒部分,最高可達微秒(6 位數)的精確度。小數部分應始終使用小數點與時間的其餘部分分隔;不識別其他小數秒分隔符號。有關 MySQL 中小數秒支援的資訊,請參閱 第 13.2.6 節「時間值中的小數秒」。
包含兩位數年份值的日期不明確,因為世紀未知。MySQL 使用下列規則解讀兩位數的年份值
範圍
70-99
中的年份值會變成1970-1999
。範圍
00-69
中的年份值會變成2000-2069
。
另請參閱 第 13.2.9 節「日期中的 2 位數年份」。
對於指定為包含日期分隔符號的字串值,小於 10
的月份或日期值不需要指定為兩位數。'2015-6-9'
與 '2015-06-09'
相同。同樣地,對於指定為包含時間分隔符號的字串值,小於 10
的小時、分鐘或秒鐘值不需要指定為兩位數。'2015-10-30 1:2:3'
與 '2015-10-30 01:02:03'
相同。
指定為數字的值長度應為 6、8、12 或 14 位數。如果數字長度為 8 或 14 位數,則假設其格式為 YYYYMMDD
或 YYYYMMDDhhmmss
,且年份由前 4 位數給定。如果數字長度為 6 或 12 位數,則假設其格式為 YYMMDD
或 YYMMDDhhmmss
,且年份由前 2 位數給定。長度不屬於這些情況的數字會被解釋為在最接近的長度前補零。
指定為無分隔符號字串的值會根據其長度進行解釋。對於長度為 8 或 14 個字元的字串,年份假設由前 4 個字元給定。否則,年份假設由前 2 個字元給定。字串會從左到右進行解釋,以找出年、月、日、小時、分鐘和秒鐘值,盡可能找到字串中存在的部分。這表示您不應使用少於 6 個字元的字串。例如,如果您指定 '9903'
,並認為它代表 1999 年 3 月,MySQL 會將其轉換為「零」的日期值。之所以會發生這種情況,是因為年份和月份值為 99
和 03
,但完全缺少日期部分。不過,您可以明確指定零值來表示遺失的月份或日期部分。例如,要插入值 '1999-03-00'
,請使用 '990300'
。
MySQL 可辨識以下格式的 TIME
值
以
'D hh:mm:ss'
格式的字串。您也可以使用下列其中一種「寬鬆」語法:'hh:mm:ss'
、'hh:mm'
、'D hh:mm'
、'D hh'
或'ss'
。此處的D
代表天數,其值可以從 0 到 34。以
'hhmmss'
格式的無分隔符號字串,前提是它作為時間有意義。例如,'101112'
會被理解為'10:11:12'
,但'109712'
是不合法的(它有不合理的分鐘部分),並且會變成'00:00:00'
。以
hhmmss
格式的數字,前提是它作為時間有意義。例如,101112
會被理解為'10:11:12'
。以下替代格式也可以理解:ss
、mmss
或hhmmss
。
在 'D hh:mm:ss.fraction'
、'hh:mm:ss.fraction'
、'hhmmss.fraction'
和 hhmmss.fraction
時間格式中,會識別尾隨的小數秒部分,其中 fraction
是小數部分,精度最高可達微秒(6 位數)。小數部分應始終以小數點與時間的其餘部分分隔;不會識別其他小數秒分隔符號。如需有關 MySQL 中小數秒支援的資訊,請參閱第 13.2.6 節「時間值中的小數秒」。
對於指定為包含時間部分分隔符號的字串的 TIME
值,小於 10
的小時、分鐘或秒鐘值不需要指定為兩位數。'8:3:2'
與 '08:03:02'
相同。
當將 TIMESTAMP
和 DATETIME
值插入資料表時,您可以指定時區偏移。偏移會附加到日期時間常值的時間部分,沒有中間的空格,並且使用與設定 time_zone
系統變數相同的格式,但有下列例外情況
對於小於 10 的小時值,需要前導零。
值
'-00:00'
會被拒絕。時區名稱(例如
'EET'
和'Asia/Shanghai'
)不能使用;'SYSTEM'
在此情況下也不能使用。
插入的值的月份部分、日期部分或兩個部分都不得為零。無論伺服器 SQL 模式設定為何,都會強制執行此操作。
此範例說明如何使用不同的 time_zone
設定,將具有時區偏移的日期時間值插入 TIMESTAMP
和 DATETIME
資料行,然後擷取它們
mysql> CREATE TABLE ts (
-> id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> col TIMESTAMP NOT NULL
-> ) AUTO_INCREMENT = 1;
mysql> CREATE TABLE dt (
-> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> col DATETIME NOT NULL
-> ) AUTO_INCREMENT = 1;
mysql> SET @@time_zone = 'SYSTEM';
mysql> INSERT INTO ts (col) VALUES ('2020-01-01 10:10:10'),
-> ('2020-01-01 10:10:10+05:30'), ('2020-01-01 10:10:10-08:00');
mysql> SET @@time_zone = '+00:00';
mysql> INSERT INTO ts (col) VALUES ('2020-01-01 10:10:10'),
-> ('2020-01-01 10:10:10+05:30'), ('2020-01-01 10:10:10-08:00');
mysql> SET @@time_zone = 'SYSTEM';
mysql> INSERT INTO dt (col) VALUES ('2020-01-01 10:10:10'),
-> ('2020-01-01 10:10:10+05:30'), ('2020-01-01 10:10:10-08:00');
mysql> SET @@time_zone = '+00:00';
mysql> INSERT INTO dt (col) VALUES ('2020-01-01 10:10:10'),
-> ('2020-01-01 10:10:10+05:30'), ('2020-01-01 10:10:10-08:00');
mysql> SET @@time_zone = 'SYSTEM';
mysql> SELECT @@system_time_zone;
+--------------------+
| @@system_time_zone |
+--------------------+
| EST |
+--------------------+
mysql> SELECT col, UNIX_TIMESTAMP(col) FROM dt ORDER BY id;
+---------------------+---------------------+
| col | UNIX_TIMESTAMP(col) |
+---------------------+---------------------+
| 2020-01-01 10:10:10 | 1577891410 |
| 2019-12-31 23:40:10 | 1577853610 |
| 2020-01-01 13:10:10 | 1577902210 |
| 2020-01-01 10:10:10 | 1577891410 |
| 2020-01-01 04:40:10 | 1577871610 |
| 2020-01-01 18:10:10 | 1577920210 |
+---------------------+---------------------+
mysql> SELECT col, UNIX_TIMESTAMP(col) FROM ts ORDER BY id;
+---------------------+---------------------+
| col | UNIX_TIMESTAMP(col) |
+---------------------+---------------------+
| 2020-01-01 10:10:10 | 1577891410 |
| 2019-12-31 23:40:10 | 1577853610 |
| 2020-01-01 13:10:10 | 1577902210 |
| 2020-01-01 05:10:10 | 1577873410 |
| 2019-12-31 23:40:10 | 1577853610 |
| 2020-01-01 13:10:10 | 1577902210 |
+---------------------+---------------------+
選取日期時間值時,即使在插入時使用了偏移,也不會顯示偏移。
支援的偏移值範圍為 -13:59
到 +14:00
(含)。
包含時區偏移的日期時間常值會被預備陳述式接受為參數值。