假設表 article 有時間欄位 add_time,分別為 UNIX 時間戳 (INT) 或 DATETIME/TIMESTAMP 類型,提供通用查詢模板。
-- 今天 SELECT * FROM `article` WHERE DATE_FORMAT(FROM_UNIXTIME(`add_time`),'%Y-%m-%d') = DATE_FORMAT(NOW(),'%Y-%m-%d'); -- 或使用 TO_DAYS (粒度到天) SELECT * FROM `article` WHERE TO_DAYS(DATE_FORMAT(FROM_UNIXTIME(`add_time`),'%Y-%m-%d')) = TO_DAYS(NOW());
-- 今天 SELECT * FROM `article` WHERE TO_DAYS(`add_time`) = TO_DAYS(NOW()); -- 昨天 SELECT * FROM `article` WHERE TO_DAYS(NOW()) - TO_DAYS(`add_time`) <= 1; -- 近 7 天 SELECT * FROM `article` WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(`add_time`); -- 近 30 天 SELECT * FROM `article` WHERE DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= DATE(`add_time`); -- 本月 SELECT * FROM `article` WHERE DATE_FORMAT(`add_time`,'%Y%m') = DATE_FORMAT(CURDATE(),'%Y%m'); -- 上月 SELECT * FROM `article` WHERE PERIOD_DIFF(DATE_FORMAT(NOW(),'%Y%m'), DATE_FORMAT(`add_time`,'%Y%m')) = 1;
| 函數 | 說明 | 注意事項 |
|---|---|---|
TO_DAYS(date) | 日期轉天數 (從年 0 起) | 不適用 1582 年前日期;兩位年份自動補全為四位 |
DATE_SUB(date, INTERVAL n UNIT) | 日期減法 | 支援 DAY/MONTH/YEAR 等單位 |
PERIOD_DIFF(P1,P2) | 月份差 (YYYYMM 格式) | 僅限年月,不含日 |
STR_TO_DATE(str, fmt) | 字串解析為 DATETIME | 精確到秒,適合精細時間範圍查詢 |
SELECT * FROM `article` WHERE STR_TO_DATE(`add_time`,'%Y-%m-%d %H:%i:%s') BETWEEN '2012-06-28 08:00:00' AND '2012-06-28 09:59:59';
DATE(`add_time`))add_time >= '2024-01-01 00:00:00' AND add_time < '2024-01-02 00:00:00'