首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL DATE 日期類型使用全攻略:格式、比較與邊界處理

     編輯:MySQL 資料庫相關知識

標準格式與自動轉換

DATE 標準格式為 'YYYY-MM-DD'。UPDATE 與 WHERE 子句必須使用此格式。MySQL 在數值語境下自動雙向轉換日期與數字;比較時允許「寬鬆字串」:任意標點作分隔符('2004-08-15' = '2004#08#15'),甚至無分隔符('20040815'),前提是構成合法日期。

比較運算子的內部處理

使用 <, <=, =, >=, >, BETWEEN 與常數字串比較 DATE/TIME/DATETIME/TIMESTAMP 時,MySQL 通常將字串轉為內部長整數以利快速比較(含寬鬆檢查)。例外情況(改為字串比較):

  • 兩欄位互相比較。
  • 欄位與表達式比較。
  • 使用 IN、STRCMP() 等其他比較方式。

建議:假設字串比較為字串比較,比較時空值請用適當字串函數處理。

特殊值 '0000-00-00' 與 SQL 模式

  • 可儲存/檢索 '0000-00-00'。MyODBC 2.50.12+ 自動轉為 NULL。
  • ALLOW_INVALID_DATES:僅檢查日 1-31、月 1-12,適合 Web 應用分欄位收集日期。
  • NO_ZERO_IN_DATE:啟用後日/月不可為 0。
  • NO_ZERO_DATE:啟用後禁止 '0000-00-00'。
  • 無法轉換的日期存為 0,檢索為 '0000-00-00'。MySQL 傾向「存什麼取什麼」,日期驗證建議由應用層負責。
  • 嚴格模式:SET sql_mode = 'NO_ZERO_IN_DATE,NO_ZERO_DATE'。

實用範例

以下語句均正常工作:

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

以下不工作(STRCMP 為字串函數,將欄位轉為 'YYYY-MM-DD' 格式比較,不會將 '20030505' 解析為日期):

SELECT * FROM tbl WHERE STRCMP(idate, '20030505') = 0;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved