在SQL查询中,筛选特定时间段记录是高频需求,核心是通过WHERE子句结合时间条件来实现,不同数据库和时间字段类型的写法存在差异,需要针对性处理。

常见时间字段类型与存储格式
数据库中常用的时间相关字段类型有datetime、timestamp、date等,不同字段的存储精度不同:
date类型仅存储年月日,比如2024-05-20datetime类型存储年月日时分秒,比如2024-05-20 14:30:00timestamp类型存储时间戳,部分数据库会自动转换时区
基础时间范围查询写法
使用BETWEEN AND语法
如果要查询2024年5月1日到2024年5月31日之间的订单记录,订单时间字段为order_time,标准写法如下:
-- 查询5月整月的订单,包含首尾时间点 SELECT order_id, order_time, total_amount FROM orders WHERE order_time BETWEEN '2024-05-01 00:00:00' AND '2024-05-31 23:59:59';
注意BETWEEN AND是闭区间,会包含两端的时间点,如果时间字段是date类型,可以简化为:
-- date类型字段查询5月整月 SELECT * FROM orders WHERE order_time BETWEEN '2024-05-01' AND '2024-05-31';
使用大于小于符号
如果需要排除边界时间点,或者时间范围不连续,可以用大于小于符号组合:
-- 查询2024年5月1日之后,不包含5月1日当天的订单 SELECT * FROM orders WHERE order_time > '2024-05-01 00:00:00' AND order_time < '2024-06-01 00:00:00';
不同数据库的特殊处理
MySQL数据库
MySQL支持DATE()函数提取日期部分,也可以直接用字符串匹配:
-- 查询2024年5月的订单,忽略时分秒 SELECT * FROM orders WHERE DATE(order_time) = '2024-05-01'; -- 或者用字符串前缀匹配 SELECT * FROM orders WHERE order_time LIKE '2024-05-%';
PostgreSQL数据库
PostgreSQL的时间类型支持范围类型写法,也可以用date_trunc函数处理:
-- 查询2024年5月的订单 SELECT * FROM orders WHERE order_time >= '2024-05-01'::timestamp AND order_time < '2024-06-01'::timestamp;
常见问题与注意事项
- 时间字符串格式要和字段存储格式匹配,比如
datetime字段不要用仅年月日的字符串做等值查询,会匹配不到数据 - 涉及时区的场景,要统一时间转换逻辑,避免本地时间和数据库存储时间偏差导致筛选错误
- 对时间字段使用函数(比如
DATE(order_time))会导致索引失效,大数据量查询时建议用范围条件代替函数处理
实战示例
假设要查询最近7天的用户登录记录,登录时间字段为login_time,当前时间为2024-05-20,写法如下:
-- 查询最近7天的登录记录
SELECT user_id, login_time
FROM user_login_log
WHERE login_time >= DATE_SUB('2024-05-20', INTERVAL 7 DAY)
AND login_time <= '2024-05-20 23:59:59';
SQLWHERE子句时间范围查询datetime类型修改时间:2026-06-11 12:54:31