在開發 PHP 應用時,常需要依據時間範圍篩選資料庫記錄。本文整理了以 Unix 時間戳為儲存格式的資料表,如何撰寫 SQL 查詢「今日」、「本週」、「本月」及「今年」的資料,並提供 PHP 取得各時間區間起始與結束時間戳的實用函式,方便直接套用專案中。
table_name(範例中亦出現 video,請依實際情況修改)time,型別為 INT,儲存 Unix 時間戳透過 PHP 產生今日 00:00:00 與目前時間的字串,再用 unix_timestamp() 轉換為時間戳進行比對。
$start = date('Y-m-d 00:00:00');
$end = date('Y-m-d H:i:s');
$sql = "SELECT * FROM `table_name`
WHERE `time` >= unix_timestamp('$start')
AND `time` <= unix_timestamp('$end')";
MySQL 的 YEARWEEK() 函式可取得年份與週數。第二個參數設為 1,表示以週一為每週第一天(符合中文習慣)。
SELECT * FROM `table_name`
WHERE YEARWEEK(FROM_UNIXTIME(`time`, '%Y-%m-%d %H:%i:%s'), 1)
= YEARWEEK(NOW(), 1);
補充說明:
DAYOFWEEK():週日為 1,週一為 2 … 週六為 7。WEEKDAY():週一為 0,週二為 1 … 週日為 6。若需符合中文習慣,可用 WEEKDAY() + 1。取得本月第一天 00:00:00 及目前時間。
$start = date('Y-m-01 00:00:00');
$end = date('Y-m-d H:i:s');
$sql = "SELECT * FROM `table_name`
WHERE `time` >= unix_timestamp('$start')
AND `time` <= unix_timestamp('$end')";
$start = date('Y-01-01 00:00:00');
$end = date('Y-m-d H:i:s');
$sql = "SELECT * FROM `table_name`
WHERE `time` >= unix_timestamp('$start')
AND `time` <= unix_timestamp('$end')";
利用 mktime() 快速計算,適用於程式邏輯中直接比對時間戳,避免在 SQL 內轉換格式。
$beginToday = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
$endToday = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1;
$beginYesterday = mktime(0, 0, 0, date('m'), date('d') - 1, date('Y'));
$endYesterday = mktime(0, 0, 0, date('m'), date('d'), date('Y')) - 1;
$beginLastWeek = mktime(0, 0, 0, date('m'), date('d') - date('w') + 1 - 7, date('Y'));
$endLastWeek = mktime(23, 59, 59, date('m'), date('d') - date('w') + 7 - 7, date('Y'));
$beginThisMonth = mktime(0, 0, 0, date('m'), 1, date('Y'));
$endThisMonth = mktime(23, 59, 59, date('m'), date('t'), date('Y'));
| 參數 | 說明 |
|---|---|
| hour | 時(可選) |
| minute | 分(可選) |
| second | 秒(可選) |
| month | 月(可選) |
| day | 日(可選) |
| year | 年(可選) |
| is_dst | 夏令時標記,PHP 5.1 後已棄用,請改用時區設定 |
參數可由右至左依序省略,預設為當前 GMT 時間。
掌握上述查詢語法與 PHP 時間戳函式,即可輕鬆處理大多數「按時間範圍統計」的需求。實際專案中建議將常用區間封裝為工具類或 Helper 函式,提升程式碼複用性與可維護性。