文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  使用 DATE 欄位的問題

B.3.4.2 使用 DATE 欄位的問題

DATE 值的格式為 'YYYY-MM-DD'。根據標準 SQL,不允許其他格式。您應該在 UPDATE 表達式和 SELECT 陳述式的 WHERE 子句中使用此格式。例如

SELECT * FROM t1 WHERE date >= '2003-05-05';

為了方便起見,如果日期在數值環境中使用,MySQL 會自動將日期轉換為數字,反之亦然。當更新以及在將日期與 DATEDATETIMETIMESTAMP 欄位比較的 WHERE 子句中,MySQL 也允許使用「寬鬆」的字串格式。「寬鬆」格式表示任何標點符號字元都可用作各部分之間的分隔符號。例如,'2004-08-15''2004#08#15' 是等效的。MySQL 也可以轉換不包含分隔符號的字串(例如 '20040815'),只要它在日期上是有意義的。

當您使用 <<==>=>BETWEEN 運算子將 DATETIMEDATETIMETIMESTAMP 與常數字串比較時,MySQL 通常會將字串轉換為內部長整數,以便更快地進行比較(也為了更「寬鬆」的字串檢查)。但是,此轉換受以下例外情況的約束

  • 當您比較兩個欄位時

  • 當您將 DATETIMEDATETIMETIMESTAMP 欄位與表達式比較時

  • 當您使用剛才列出的以外的任何比較方法時,例如 INSTRCMP()

對於這些例外情況,比較是透過將物件轉換為字串並執行字串比較來完成。

為了安全起見,假設字串是作為字串進行比較的,如果您想要將時間值與字串比較,請使用適當的字串函式。

特殊的「零」日期 '0000-00-00' 可以儲存和擷取為 '0000-00-00'。當透過 Connector/ODBC 使用 '0000-00-00' 日期時,它會自動轉換為 NULL,因為 ODBC 無法處理該類型的日期。

因為 MySQL 執行了剛才描述的轉換,因此以下陳述式有效(假設 idateDATE 欄位)

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 應用程式,在 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"