資料庫時間欄位儲存 Unix 時間戳 (INT),查詢時用 PHP mktime() 計算目標時間戳,再以數值比對。
$now = time();
// 一個月前
$lastMonth = mktime(date('H'), date('i'), date('s'), date('m') - 1, date('d'), date('Y'));
$where = " dtime < $lastMonth ";
// 三個月前
$lastThreeMonth = mktime(date('H'), date('i'), date('s'), date('m') - 3, date('d'), date('Y'));
$where = " dtime < $lastThreeMonth ";
// 七天前
$lastWeek = mktime(date('H'), date('i'), date('s'), date('m'), date('d') - 7, date('Y'));
// 一小時前
$lastHour = mktime(date('H') - 1, date('i'), date('s'), date('m'), date('d'), date('Y'));
// 完整 SQL
$sql = "SELECT * FROM testtable WHERE $where";
| 需求 | mktime 參數調整 |
|---|---|
| N 個月前 | date('m') - N |
| N 天前 | date('d') - N |
| N 小時前 | date('H') - N |
| N 分鐘前 | date('i') - N |
| N 秒前 | date('s') - N |
-- 儲存為 DATETIME,建立索引
ALTER TABLE testtable MODIFY dtime DATETIME;
ALTER TABLE testtable ADD INDEX idx_dtime (dtime);
-- 查詢最近 3 個月(可用索引)
SELECT * FROM testtable
WHERE dtime >= DATE_SUB(NOW(), INTERVAL 3 MONTH);
FUNCTION 封裝 FROM_UNIXTIME() 搭配函數索引(MySQL 8.0+)。