統計每日訪問量、按小時分桶分析等「時間段」查詢極為常見。MySQL 時間類型包括 DATE、TIME、DATETIME、TIMESTAMP,儲存方式不一,但查詢邏輯相通。
-- 查詢 2010-03-01 當天數據 SELECT COUNT(*) FROM sometable WHERE datetime_col >= '2010-03-01 00:00:00' AND datetime_col < '2010-03-02 00:00:00';
UNIX_TIMESTAMP(datetime) → 整數秒數(從 1970-01-01 00:00:00 UTC)FROM_UNIXTIME(unixtime) → 還原為 DATETIMESELECT UNIX_TIMESTAMP('2010-03-01 00:00:00'); -- 1267372800
SELECT FROM_UNIXTIME(1267372800); -- '2010-03-01 00:00:00'
-- 假設表中 datetime_col 已存為 INT UNIX 時間戳
SELECT COUNT(*) FROM sometable
WHERE datetime_col >= UNIX_TIMESTAMP('2010-03-01 00:00:00')
AND datetime_col < UNIX_TIMESTAMP('2010-03-02 00:00:00');
或在應用層預先轉換再傳參,SQL 直接整數比較。
| 維度 | 傳統字符串 | UNIX 時間戳 |
|---|---|---|
| 比較速度 | 字符串逐字節比較 | 整數比較,極快 |
| 索引效果 | B-Tree 範圍掃描 | 同樣 B-Tree,但 CPU 開銷更低 |
| 存儲空間 | DATETIME 8 字節 | INT 4 字節(節省 50%) |
| 時區處理 | 依賴 session time_zone | UTC 統一,應用層轉換更可控 |
| 可讀性 | 原生可讀 | 需 FROM_UNIXTIME 還原 |
| 適用場景 | 中小表、臨時查詢、強可讀性需求 | 大表、高頻時間範圍查詢、分區鍵、跨時區系統 |
INT UNSIGNED NOT NULL 存 UNIX 時間戳,建立索引。unix_ts INT 列,UPDATE SET unix_ts = UNIX_TIMESTAMP(datetime_col),驗證後切換查詢邏輯。unix_ts DIV 86400(天數)或 TO_DAYS(FROM_UNIXTIME(unix_ts)) 作為分區鍵。