DATE
值的格式為 '
。根據標準 SQL,不允許其他格式。您應該在 YYYY-MM-DD
'UPDATE
表達式和 SELECT
陳述式的 WHERE
子句中使用此格式。例如
SELECT * FROM t1 WHERE date >= '2003-05-05';
為方便起見,如果日期在數值內容中使用,MySQL 會自動將日期轉換為數字,反之亦然。當更新和在將日期與 DATE
、DATETIME
或 TIMESTAMP
欄位比較的 WHERE
子句中時,MySQL 也允許使用「寬鬆」的字串格式。「寬鬆」格式表示任何標點符號都可以用作各部分之間的分隔符號。例如,'2004-08-15'
和 '2004#08#15'
是等效的。如果字串的日期有意義,MySQL 也可以轉換不包含分隔符號的字串(例如 '20040815'
)。
當您使用 <
、<=
、=
、>=
、>
或 BETWEEN
運算子將 DATE
、TIME
、DATETIME
或 TIMESTAMP
與常數字串比較時,MySQL 通常會將字串轉換為內部長整數,以加快比較速度(並且也為了進行更多「寬鬆」的字串檢查)。但是,此轉換受到以下例外情況的約束:
對於這些例外情況,比較是透過將物件轉換為字串並執行字串比較來完成的。
為了安全起見,假設字串是作為字串比較的,如果您想將時間值與字串比較,請使用適當的字串函數。
特殊的「零」日期 '0000-00-00'
可以儲存並檢索為 '0000-00-00'
。當透過 Connector/ODBC 使用 '0000-00-00'
日期時,它會自動轉換為 NULL
,因為 ODBC 無法處理那種日期。
由於 MySQL 執行了剛才描述的轉換,因此以下陳述式有效(假設 idate
是 DATE
欄位)
INSERT INTO t1 (idate) VALUES (19970505);
INSERT INTO t1 (idate) VALUES ('19970505');
INSERT INTO t1 (idate) VALUES ('97-05-05');
INSERT INTO t1 (idate) VALUES ('1997.05.05');
INSERT INTO t1 (idate) VALUES ('1997 05 05');
INSERT INTO t1 (idate) VALUES ('0000-00-00');
SELECT idate FROM t1 WHERE idate >= '1997-05-05';
SELECT idate FROM t1 WHERE idate >= 19970505;
SELECT MOD(idate,100) FROM t1 WHERE idate >= 19970505;
SELECT idate FROM t1 WHERE idate >= '19970505';
但是,以下陳述式無效
SELECT idate FROM t1 WHERE STRCMP(idate,'20030505')=0;
STRCMP()
是一個字串函數,因此它會將 idate
轉換為 '
格式的字串,並執行字串比較。它不會將 YYYY-MM-DD
''20030505'
轉換為日期 '2003-05-05'
並執行日期比較。
如果您啟用 ALLOW_INVALID_DATES
SQL 模式,MySQL 允許您儲存僅經過有限檢查的日期:MySQL 僅要求日期在 1 到 31 的範圍內,月份在 1 到 12 的範圍內。這使得 MySQL 非常方便用於 Web 應用程式,在這些應用程式中,您可以從三個不同的欄位中取得年、月和日,並且您想完全儲存使用者插入的內容(沒有日期驗證)。
MySQL 允許您儲存日或月和日為零的日期。如果您想在 DATE
欄位中儲存生日,而您只知道部分日期,這會很方便。若要不允許日期中出現零月份或零日部分,請啟用 NO_ZERO_IN_DATE
模式。
MySQL 允許您將 '0000-00-00'
的「零」值儲存為「虛擬日期」。在某些情況下,這比使用 NULL
值更方便。如果要儲存在 DATE
欄位中的日期無法轉換為任何合理的值,MySQL 會儲存 '0000-00-00'
。若要不允許 '0000-00-00'
,請啟用 NO_ZERO_DATE
模式。
若要讓 MySQL 檢查所有日期並只接受合法日期(除非被 IGNORE
覆寫),請將 sql_mode
系統變數設定為 "NO_ZERO_IN_DATE,NO_ZERO_DATE"
。