在Timestamp类型字段使用Between子句查询日期结果不准确问题
解决Timestamp字段日期范围查询的准确性问题
问题根源:你的
date_order是timestamp类型,包含时分秒信息。用BETWEEN "2023-01-01" AND "2023-12-31"时,数据库会把后者自动解析为2023-12-31 00:00:00,这就导致2023年12月31日当天0点之后的所有记录(比如2023-12-31 14:30:00)都被排除在外,结果自然不准。正确的查询写法:
要包含2023年全年的所有timestamp记录,应该用左闭右开的范围条件,把结束日期设为下一年的第一天:select * from list_order where date_order >= "2023-01-01" and date_order < "2024-01-01" and deleted_at is null;这样就能覆盖从2023-01-01 00:00:00到2023-12-31 23:59:59.999...的所有数据。
关于你测试的第二个语句:
你写的date_order < "2023-12-31"会排除2023年12月31日的所有记录,这显然不符合“获取全年数据”的需求,所以不能用。备选方案(不推荐,影响索引效率):
如果一定要用BETWEEN,可以把date_order转成日期类型后再比较,但这样会导致date_order上的索引失效(如果有索引的话),查询速度会变慢:select * from list_order where DATE(date_order) between "2023-01-01" and "2023-12-31" and deleted_at is null;
内容的提问来源于stack exchange,提问作者Isfan Rachmad
相关产品推荐
相关产品推荐

