top
Loading...
A.5.2.使用DATE列方面的問題
A.5.2. 使用DATE列方面的問題

DATE值的格式是'YYYY-MM-DD'按照標準的SQL,不允許其他格式。在UPDATE表達式以及SELECT語句的WHERE子句中應使用該格式。例如:

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

為了方便,如果日期是在數值環境下使用的,MySQL會自動將日期轉換為數值(反之亦然)。它還具有相當的智能,在更新時或在與TIMESTAMPDATEDATETIME列比較日期的WHERE子句中,允許寬松的字符串形式(寬松形式表示,任何標點字符均能用作各部分之間的分隔符。例如,'2004-08-15''2004#08#15'是等同的)。MySQL還能轉換不含任何分隔符的字符串(如'20040815'),前體是它必須是有意義的日期。

使用<<==>=>、或BETWEEN操作符將DATETIMEDATETIMETIMESTAMP與常量字符串進行比較時,MySQL通常會將字符串轉換為內部長整數,以便進行快速比較(以及略為“寬松”的字符串檢查)。但是,該轉換具有下述例外:

比較兩列時

DATETIMEDATETIMETIMESTAMP列與表達式進行比較時

使用其他比較方法時,如INSTRCMP()

對于這些例外情形,會將對象轉換為字符串并執行字符串比較,采用該方式進行比較。

為了保持安全,假定按字符串比較字符串,如果你打算比較臨時值和字符串,將使用恰當的字符串函數。

對于特殊日期'0000-00-00',能夠以'0000-00-00'形式保存和檢索。在MyODBC中使用'0000-00-00'日期時,對于MyODBC 2.50.12或更高版本,該日期將被自動轉換為NULL,這是因為ODBC不能處理這類日期。

由于MySQL能夠執行前面所介紹的轉換,下述語句均能正常工作:

mysql> INSERT INTO tbl_name (idate) VALUES (19970505);
mysql> INSERT INTO tbl_name (idate) VALUES ('19970505');
mysql> INSERT INTO tbl_name (idate) VALUES ('97-05-05');
mysql> INSERT INTO tbl_name (idate) VALUES ('1997.05.05');
mysql> INSERT INTO tbl_name (idate) VALUES ('1997 05 05');
mysql> INSERT INTO tbl_name (idate) VALUES ('0000-00-00');
 
mysql> SELECT idate FROM tbl_name WHERE idate >= '1997-05-05';
mysql> SELECT idate FROM tbl_name WHERE idate >= 19970505;
mysql> SELECT MOD(idate,100) FROM tbl_name WHERE idate >= 19970505;
mysql> SELECT idate FROM tbl_name WHERE idate >= '19970505';

但是,下述語句不能正常工作:

mysql> SELECT idate FROM tbl_name WHERE STRCMP(idate,'20030505')=0;

STRCMP()是一種字符串函數,它能將idate轉換為'YYYY-MM-DD'格式的字符串,并執行字符串比較。它不能將'20030505'轉換為日期'2003-05-05'并進行日期比較。

如果你正在使用ALLOW_INVALID_DATES SQL模式,MySQL允許以僅執行給定的有限檢查方式保存日期:MySQL僅保證天位于131的范圍內,月位于112的范圍內。

這樣就使得MySQL很適合于Web應用程序,其中,你能獲得三個不同字段中的年、月、日值,也能準確保存用戶插入的值(無日期驗證)。

如果未使用NO_ZERO_IN_DATE SQL模式,“天”和“月”部分可能為0。如果你打算將生日保存在DATE列而且僅知道部分日期,它十分方便。

如果未使用NO_ZERO_DATE SQL模式,MySQL也允許你將'0000-00-00'保存為“偽日期”。在某些情況下,它比使用NULL值更方便。

如果無法將日期轉換為任何合理值,“0”將保存在DATE列中,并被檢索為'0000-00-00'。這是兼顧速度和便利性的事宜。我們認為,數據庫服務器的職責是檢索與你保存的日期相同的日期(即使在任何情況下,數據在邏輯上不正確也同樣)。我們認為,對日期的檢查應由應用程序而不是服務器負責。

如果你希望MySQL檢查所有日期并僅接受合法日期(除非由IGNORE覆蓋),應將sql_mode設置為"NO_ZERO_IN_DATE,NO_ZERO_DATE"

作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/problems.html
北斗有巢氏 有巢氏北斗