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。
SELECT NOW() - INTERVAL 10 SECOND;
SELECT NOW() - INTERVAL 5 MINUTE;
SELECT NOW() - INTERVAL 3 HOUR;
SELECT NOW() - INTERVAL 2 DAY;
SELECT DATE_SUB(NOW(), INTERVAL 10 SECOND);
SELECT DATE_ADD(NOW(), INTERVAL -10 SECOND);
UNIX_TIMESTAMP(NOW()) - 10 再 FROM_UNIXTIME() 轉回。INTERVAL 避免隱式轉換 Bug。一個 INTERVAL 關鍵字,消除 MySQL 日期運算最大的隱性坑。