首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 相對時間查詢大全:今日、昨日、近 7/30 天、本月、上月

     編輯:MySQL 資料庫相關知識

假設表 article 有時間欄位 add_time,分別為 UNIX 時間戳 (INT) 或 DATETIME/TIMESTAMP 類型,提供通用查詢模板。

時間戳 (INT) 類型

-- 今天
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());

DATETIME / TIMESTAMP 類型

-- 今天
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'
  • 大表分區按時間維度 (RANGE PARTITION) 可實現分區裁剪
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved