CREATE TABLE IF NOT EXISTS t (
id INT,
addTime DATETIME DEFAULT '0000-00-00 00:00:00'
);
INSERT INTO t VALUES (1, '2012-07-12 21:00:00'), (2, '2012-07-22 21:00:00');
| 方法 | SQL | 推薦度 |
|---|---|---|
| 日期格式化對比 | WHERE DATE_FORMAT(addTime,'%Y-%m-%d') = DATE_FORMAT(NOW(),'%Y-%m-%d') | ⭐ |
| 簡寫範圍查詢 | WHERE addTime >= DATE_FORMAT(NOW(),'%Y-%m-%d') | ⭐⭐ |
| DATEDIFF 函數 | WHERE DATEDIFF(addTime, NOW()) = 0 | ⭐⭐⭐ 推薦 |
| 時間戳範圍 | WHERE addTime BETWEEN UNIX_TIMESTAMP(NOW()-86400) AND NOW() | ⭐ |
時間函數差異:NOW() 含時分秒;CURDATE()/CURRENT_DATE() 僅日期。
SELECT DAYOFMONTH(NOW())SELECT DATE_SUB(NOW(), INTERVAL DAYOFMONTH(NOW())-1 DAY)SELECT DATE_SUB(DATE_SUB(NOW(), INTERVAL DAYOFMONTH(NOW())-1 DAY), INTERVAL 1 MONTH)日期運算核心:DATE_ADD(date, INTERVAL expr type) / DATE_SUB(...)
expr:間隔數值,負值加減號type:YEAR/MONTH/DAY/WEEK 等INTERVAL 關鍵字雙重含義:
INTERVAL(10,1,3,5,7) 返回 4(比較小於 10 的個數)INTERVAL 1 DAY 設置間隔SELECT WEEKDAY(NOW())(0=周一,6=周日)SELECT DATE_SUB(NOW(), INTERVAL WEEKDAY(NOW()) DAY)WHERE addTime >= DATE_FORMAT(DATE_SUB(DATE_SUB(NOW(), INTERVAL WEEKDAY(NOW()) DAY), INTERVAL 1 WEEK), '%Y-%m-%d')⚠️ 若存儲為時間戳,先用 FROM_UNIXTIME() 轉換。
SELECT FROM_UNIXTIME(1336542121)SELECT UNIX_TIMESTAMP('2013-04-08')-- 日期類型字段
WHERE inputtime > DATE_SUB(CURDATE(), INTERVAL 1 DAY)
WHERE inputtime > DATE_SUB(CURDATE(), INTERVAL 1 WEEK)
WHERE inputtime > DATE_SUB(CURDATE(), INTERVAL 1 MONTH)
WHERE inputtime > DATE_SUB(CURDATE(), INTERVAL 1 YEAR)
-- 時間戳類型字段(需統一格式)
WHERE inputtime > UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY))
WHERE inputtime > UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 WEEK))
WHERE inputtime > UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 MONTH))
WHERE inputtime > UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 YEAR))
DATE_SUB/DATE_ADD:日期加減UNIX_TIMESTAMP:日期轉時間戳FROM_UNIXTIME:時間戳轉日期DATEDIFF:日期差值(天)DAYOFMONTH/WEEKDAY:日期屬性提取