SELECT UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 60 DAY));
解析:
NOW() 獲取當前日期時間。DATE_SUB(..., INTERVAL 60 DAY) 向前推 60 天。UNIX_TIMESTAMP() 轉換為秒級 Unix 時間戳。| SQL | 特點 |
|---|---|
ADDDATE 支援負間隔,語義同 DATE_SUB。 | |
| 直接算術運算,最簡潔,MySQL 5.6+ 支援。 | |
| 手工換算秒數,避開日期函數,**性能最快**(純數學運算)。 |
-- 測試腳本
DELIMITER //
CREATE PROCEDURE bench()
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE v BIGINT;
DECLARE t1 BIGINT DEFAULT UNIX_TIMESTAMP(NOW(3))*1000000;
WHILE i < 1000000 DO
-- 替換下面四種寫法之一
SELECT UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 60 DAY)) INTO v;
SET i = i + 1;
END WHILE;
SELECT (UNIX_TIMESTAMP(NOW(3))*1000000 - t1) / 1000 AS elapsed_ms;
END //
DELIMITER ;
CALL bench();
典型結果(供參考):
DATE_SUB:~1,200 msADDDATE:~1,180 msNOW() - INTERVAL:~1,150 ms手工秒數:~320 ms(**快 3-4 倍**)UNIX_TIMESTAMP(NOW()) - 5184000,或應用層計算好傳參數。DATE_SUB(NOW(), INTERVAL 60 DAY) 語義清晰,維護成本低。NOW() 受 @@time_zone 影響,若需固定 UTC,改用 UTC_TIMESTAMP()。created_at >= DATE_SUB(NOW(), INTERVAL 60 DAY) 可走索引;UNIX_TIMESTAMP(created_at) >= ... 會導致索引失效。-- MySQL 5.6.4+ 支援微秒精度
SELECT UNIX_TIMESTAMP(NOW(3)) * 1000 + MICROSECOND(NOW(3)) DIV 1000 AS ms_ts;
-- 或簡單近似
SELECT FLOOR(UNIX_TIMESTAMP(NOW(3)) * 1000);