首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL NOW() 直接加減秒數陷阱:為何 NOW()-10 會錯誤與正確的 INTERVAL 寫法

     編輯:MySQL 綜合教學

MySQL 中 NOW() - 10 並不會減去 10 秒,而是按「100 進位」時間格式運算,導致錯誤的日期時間值。本文解析根因並給出標準 INTERVAL 寫法。

錯誤現象

mysql> SELECT NOW(), NOW() - 10;
+---------------------+-----------------------+
| NOW()               | NOW() - 10            |
+---------------------+-----------------------+
| 2009-09-25 21:07:20 | 20090925210710.000000 |
+---------------------+-----------------------+

結果 20090925210710 顯然不是「10 秒前」,而是將 2009-09-25 21:07:20 視為數值 20090925210720 減去 10 得到的產物。

根因

NOW() 回傳 DATETIME 型別,若直接參與數值運算,MySQL 會隱式轉換為「YYYYMMDDHHMMSS」格式的數值(以 100 為基數:秒 100、分 100、時 100),而非 Unix timestamp。

正確寫法:INTERVAL 關鍵字

SELECT NOW() - INTERVAL 10 SECOND;
SELECT NOW() - INTERVAL 5 MINUTE;
SELECT NOW() - INTERVAL 3 HOUR;
SELECT NOW() - INTERVAL 2 DAY;

延伸:DATE_ADD / DATE_SUB 等價形式

SELECT DATE_SUB(NOW(), INTERVAL 10 SECOND);
SELECT DATE_ADD(NOW(), INTERVAL -10 SECOND);

最佳實踐

  • 所有日期時間加減**務必使用 INTERVAL**,切勿直接數值運算。
  • 應用層若需 Unix timestamp,用 UNIX_TIMESTAMP(NOW()) - 10 再 FROM_UNIXTIME() 轉回。
  • 儲存程序/觸發器中同理,統一用 INTERVAL 避免隱式轉換 Bug。

一個 INTERVAL 關鍵字,消除 MySQL 日期運算最大的隱性坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved