MySQL查询昨天、一周前、一月前及一年前的数据方法
本文介绍如何在MySQL中高效查询昨天、上周、上月及去年的数据。根据时间字段的存储格式(标准日期或Unix时间戳),分别演示了利用DATE_SUB和UNIX_TIMESTAMP函数的正确SQL写法,帮助快速定位不同时间维度的历史数据。
使用标准日期格式查询
当数据库中的时间字段(如 inputtime)存储为 DATETIME 或 DATE 格式时,可以使用 DATE_SUB() 函数结合 CURDATE()(当前日期)来计算相对时间点。这种方法逻辑清晰,且能直接利用索引(如果字段有索引)。
第1步:查询昨天的数据
目的:获取从昨天开始至今的数据记录。
- 入口:SELECT 语句中的 WHERE 子句。
- 动作:使用
DATE_SUB(CURDATE(), INTERVAL 1 DAY)计算昨天的日期。 - 重要参数:
INTERVAL 1 DAY表示向前推一天。 - 完成状态:查询结果包含所有大于等于昨天零点的时间戳记录。
SELECT * FROM table_name
WHERE inputtime >= DATE_SUB(CURDATE(), INTERVAL 1 DAY);
第2步:查询一周前的数据
目的:获取从七天前开始的数据。
- 入口:WHERE 条件。
- 动作:将间隔改为
INTERVAL 1 WEEK。 - 注意:MySQL中
1 WEEK等同于7 DAY。
SELECT * FROM table_name
WHERE inputtime >= DATE_SUB(CURDATE(), INTERVAL 1 WEEK);
第3步:查询一个月前的数据
目的:获取上个月内至今的所有数据。
- 动作:使用
INTERVAL 1 MONTH。
SELECT * FROM table_name
WHERE inputtime >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH);
第4步:查询一年前的数据
目的:获取去年内至今的数据。
- 动作:使用
INTERVAL 1 YEAR。
SELECT * FROM table_name
WHERE inputtime >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR);
处理UNIX时间戳格式
如果数据库中的时间字段以 BIGINT 或 INT 类型的 UNIX 时间戳形式存放,上述直接比较日期的方法将失效,因为 DATE_SUB() 返回的是格式化后的字符串或日期对象,无法与数字时间戳直接比较。此时需要先将计算出的目标日期转换回时间戳。
第5步:时间戳字段的标准查询方案
目的:在时间戳存储模式下,实现相同的时间范围过滤。
- 入口:WHERE 条件。
- 动作:使用
UNIX_TIMESTAMP()包裹DATE_SUB()的表达式,将计算出的日期转为时间戳进行比较。 - 重要参数确保括号匹配:
UNIX_TIMESTAMP(DATE_SUB(...))。
-- 昨天
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))
相关日期函数补充说明
除了上述查询方法,以下函数在处理 MySQL 日期时也经常用到:
- CURDATE() / CURRENT_DATE():返回当前日期(无时分秒),适合只关注日期的场景。
- NOW() / SYSDATE():返回当前日期和时间(精确到秒),适合需要精确时间点的场景。
- UNIX_TIMESTAMP(date):将日期/时间转换为 Unix 时间戳。
- FROM_UNIXTIME(timestamp):将 Unix 时间戳转换为标准的 MySQL 日期格式。
- DATE_SUB(date, INTERVAL expr type):从日期减去指定的时间间隔。
type可以是DAY,WEEK,MONTH,YEAR等。
通过以上方法,可以根据数据表的实际存储结构,灵活选择最合适的 SQL 写法来获取指定时间段内的数据。以上就是MySQL查询指定时间段数据的详细内容,更多关于MySQL日期函数的技巧请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









