資料庫時間欄位儲存為 INT(10) Unix 時間戳,應用層用 mktime() 計算邊界值,SQL 僅做數值比較,極高效能。
$now = time(); // 當前時間戳
// 1 小時前
$one_hour_ago = mktime(date('H')-1, date('i'), date('s'), date('m'), date('d'), date('Y'));
// 7 天前
$seven_days_ago = mktime(date('H'), date('i'), date('s'), date('m'), date('d')-7, date('Y'));
// 1 個月前
$one_month_ago = mktime(date('H'), date('i'), date('s'), date('m')-1, date('d'), date('Y'));
// 3 個月前
$three_months_ago = mktime(date('H'), date('i'), date('s'), date('m')-3, date('d'), date('Y'));
$where = " WHERE dtime >= $three_months_ago";
$sql = "SELECT * FROM testtable $where";
若欄位為 DATETIME/TIMESTAMP,直接用函數更直觀且利用索引:
-- 近 3 個月
WHERE createtime >= DATE_SUB(NOW(), INTERVAL 3 MONTH)
-- 近 7 天
WHERE createtime >= DATE_SUB(NOW(), INTERVAL 7 DAY)
-- 近 1 小時
WHERE createtime >= DATE_SUB(NOW(), INTERVAL 1 HOUR)
mktime 參數順序:時、分、秒、月、日、年。mktime(..., 0, ...) 會自動變為上一年 12 月)。INT UNSIGNED(支援至 2106 年),或直接用 DATETIME(支援至 9999 年)。