如何用WHERE子句查询特定日期区间内的数据?
- 内容介绍
- 相关推荐
本文共计932个文字,预计阅读时间需要4分钟。
直接使用`BETWEEN`查询可能遗漏当天全部数据,因为`BETWEEN`是闭区间,而数据库中的`DATETIME`字段默认包含时分秒,如`'2023-12-31 14:22:05'`。因此,应使用以下查询确保包含当天全部数据:
更稳妥的做法是用开闭区间:date_column >= '2023-01-01' AND date_column 。这样无论字段是 <code>DATE 还是 DATETIME,都能完整覆盖整个自然年。
- MySQL/PostgreSQL/SQL Server 都支持这种写法,语义清晰且可走索引
- 避免用
DATE(date_column) = '2023-01-01',它会让索引失效 - 如果字段允许 NULL,
BETWEEN会自动跳过这些行,而显式比较不受影响
日期字符串格式必须和字段类型对齐
传入的字符串格式不对,轻则查不到数据,重则触发隐式转换导致全表扫描。比如字段是 DATE 类型,写成 WHERE create_date = '2023-01-01 10:00:00',MySQL 可能转成 '2023-01-01',但 PostgreSQL 会直接报错或返回空。
安全做法是:用字段本身类型对应的最小粒度字符串。
本文共计932个文字,预计阅读时间需要4分钟。
直接使用`BETWEEN`查询可能遗漏当天全部数据,因为`BETWEEN`是闭区间,而数据库中的`DATETIME`字段默认包含时分秒,如`'2023-12-31 14:22:05'`。因此,应使用以下查询确保包含当天全部数据:
更稳妥的做法是用开闭区间:date_column >= '2023-01-01' AND date_column 。这样无论字段是 <code>DATE 还是 DATETIME,都能完整覆盖整个自然年。
- MySQL/PostgreSQL/SQL Server 都支持这种写法,语义清晰且可走索引
- 避免用
DATE(date_column) = '2023-01-01',它会让索引失效 - 如果字段允许 NULL,
BETWEEN会自动跳过这些行,而显式比较不受影响
日期字符串格式必须和字段类型对齐
传入的字符串格式不对,轻则查不到数据,重则触发隐式转换导致全表扫描。比如字段是 DATE 类型,写成 WHERE create_date = '2023-01-01 10:00:00',MySQL 可能转成 '2023-01-01',但 PostgreSQL 会直接报错或返回空。
安全做法是:用字段本身类型对应的最小粒度字符串。

