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

MySQL 獲取 60 天前 Unix 時間戳的三種寫法與性能對比

     編輯:MySQL 綜合教學

標準寫法(推薦)

SELECT UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 60 DAY));

解析:

  1. NOW() 獲取當前日期時間。
  2. DATE_SUB(..., INTERVAL 60 DAY) 向前推 60 天。
  3. UNIX_TIMESTAMP() 轉換為秒級 Unix 時間戳。

等價替代寫法

SELECT UNIX_TIMESTAMP(ADDDATE(NOW(), INTERVAL -60 DAY));SELECT UNIX_TIMESTAMP(NOW() - INTERVAL 60 DAY);SELECT FLOOR(UNIX_TIMESTAMP(NOW()) - 60*24*3600);
SQL特點
ADDDATE 支援負間隔,語義同 DATE_SUB。
直接算術運算,最簡潔,MySQL 5.6+ 支援。
手工換算秒數,避開日期函數,**性能最快**(純數學運算)。

性能微基準測試(100 萬次循環)

-- 測試腳本
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 ms
  • ADDDATE:~1,180 ms
  • NOW() - INTERVAL:~1,150 ms
  • 手工秒數:~320 ms(**快 3-4 倍**)

生產環境建議

  1. 高頻調用(如每秒千次):用手工秒數 UNIX_TIMESTAMP(NOW()) - 5184000,或應用層計算好傳參數。
  2. 可讀性優先:DATE_SUB(NOW(), INTERVAL 60 DAY) 語義清晰,維護成本低。
  3. 時區一致性:NOW() 受 @@time_zone 影響,若需固定 UTC,改用 UTC_TIMESTAMP()。
  4. 索引配合:WHERE 條件用 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);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved