WHERE子句过滤'YYYY-MM-DD'格式日期失效?timestamp查询返回前一日数据原因
问题原因
核心是数据库对日期字符串的隐式类型转换逻辑导致的:
- 你的
start_time字段类型是timestamp without timezone,当你和字符串'2012-08-31'比较时,数据库会自动把该字符串转换为同类型的时间戳,转换后的值为2012-08-31 00:00:00。 - 你写的查询条件
start_time > '2012-08-31'实际等价于start_time > '2012-08-31 00:00:00',所有8月31日零点之后的记录都会命中条件,自然包含了8月31日全天的预约数据。
修复方案
调整查询条件即可,推荐两种写法:
- 直接指定9月的起始时间,最稳妥无精度问题:
select start_time from cd.bookings where start_time >= '2012-09-01';
- 显式指定8月31日的最大时间(不推荐,极端场景下如果有亚秒级时间可能漏数据):
select start_time from cd.bookings where start_time > '2012-08-31 23:59:59';
内容的提问来源于stack exchange,提问作者Tapan Das
相关产品推荐
相关产品推荐

