需求:查詢「最近 5 天」、「最近 10 天」內建立的記錄。
TO_DAYS(date) 回傳該日期距離公元 0 年的總天數 (整數)。兩個日期的天數差即為相隔天數。
-- 最近 5 天 (含今天)
SELECT * FROM infomess
WHERE TO_DAYS(NOW()) - TO_DAYS(dateandtime) <= 5;
-- 最近 10 天
SELECT * FROM infomess
WHERE TO_DAYS(NOW()) - TO_DAYS(dateandtime) <= 10;
-- 這寫法也可行,但無法使用日期欄位索引 (MySQL 5.6+ 部分支援)
WHERE dateandtime >= DATE_SUB(NOW(), INTERVAL 5 DAY)
TO_DAYS() 寫法在舊版 MySQL 中同樣可能無法用到索引,但邏輯最直觀、相容性最好。
dateandtime 欄位有索引:ALTER TABLE infomess ADD INDEX idx_date (dateandtime);WHERE TO_DAYS(dateandtime) ... 會導致全表掃描WHERE dateandtime >= DATE_SUB(NOW(), INTERVAL 5 DAY)<?php
$days = 5;
$sql = "SELECT * FROM infomess
WHERE dateandtime >= DATE_SUB(NOW(), INTERVAL $days DAY)";
DATETIME 或 TIMESTAMP 型別NOW() 或應用層 date('Y-m-d H:i:s')掌握日期比較邏輯與索引原理,讓時間範圍查詢又快又準。