如何实现时间范围查询_mysql项目时间字段用法

来源:这里教程网 时间:2026-02-28 20:41:20 作者:

在 MySQL 中实现时间范围查询,关键在于正确使用时间类型的字段(如

DATETIME
TIMESTAMP
DATE
)并搭配合适的比较操作符和函数。项目中常见的时间字段如
created_at
updated_at
start_time
end_time
,都可直接参与范围筛选。

时间字段类型选对是前提

MySQL 提供多种时间类型,用途不同:

DATE
:只存日期(
2024-05-20
),适合记录生日、上线日等无时间点的场景
DATETIME
:存完整日期+时间(
2024-05-20 14:30:00
),不带时区,推荐用于业务主时间字段(如订单创建时间)
TIMESTAMP
:也存日期+时间,但自动转为 UTC 存储,读取时转回当前会话时区;有范围限制(1970–2038),适合需跨时区统一管理的场景(如日志时间)

建议项目中统一用

DATETIME
,避免隐式转换和时区干扰;建表时加上
DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
可自动维护时间。

基础时间范围查询写法

BETWEEN ... AND ...
或组合
>=
 即可完成标准区间查询:

查 2024 年 5 月 1 日至 5 月 31 日创建的所有订单:

SELECT * FROM orders WHERE created_at >= '2024-05-01' AND created_at 

注意:推荐用

 替代 <code>,避免因秒级精度或微秒导致漏数据。

查今天的数据(
CURDATE()
返回日期,
NOW()
返回完整时间):

SELECT * FROM logs WHERE DATE(created_at) = CURDATE();

但注意:

DATE()
函数会使
created_at
索引失效;更优写法是:

WHERE created_at >= CURDATE() AND created_at 

按自然周期动态查询(周/月/季度)

借助 MySQL 日期函数可灵活计算边界:

查本周一到周日的数据(假设周一是每周第一天):

WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) AND created_at 

查上个月全部数据:

WHERE created_at >= DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 MONTH), '%Y-%m-01') AND created_at 

这类写法可嵌入视图或预编译 SQL,便于复用。

索引与性能要点

时间范围查询是否高效,取决于索引是否生效:

确保时间字段已建立单独索引或作为联合索引的最左前缀(如
(status, created_at)
支持
WHERE status=1 AND created_at >= ?
避免在时间字段上使用函数(如
YEAR(created_at)=2024
DATE(created_at)
),会导致索引失效
大表分页查最近 N 条时,优先用
WHERE created_at > ? ORDER BY created_at LIMIT 20
替代
OFFSET
,减少扫描开销

相关推荐