为什么使用>筛选timestamptz类型时间会返回相等日期,该如何解决?
问题原因
这个问题是timestamptz(带时区时间戳)类型的隐式转换规则导致的,主要有两种触发场景:
- 你传入的比较值
'2021-10-18 13:27:01'是不带时区的字符串,PostgreSQL会默认将其按照当前会话的时区转换为timestamptz类型再和字段比较,若字段存储的时区与会话时区不一致,就会出现肉眼可见的时间相等、但实际转换后的值满足>条件的情况。 - 查询工具展示时间时默认截断了毫秒精度,字段实际存储的是
2021-10-18 13:27:01.xxx(带毫秒的更大值),展示时只显示到秒,看起来和你传入的时间相等。
修复方案
你可以根据自己的业务需求选择以下任意一种方案:
- 给比较的时间字符串加上明确的时区,和
createdAt存储的时区保持一致(示例为UTC时区):
select * from contents where "createdAt" > '2021-10-18 13:27:01 +00';
- 显式将
createdAt转换为无时区时间戳后再比较,规避隐式时区转换的影响:
select * from contents where "createdAt"::timestamp > '2021-10-18 13:27:01';
- 若要完全排除精度截断的干扰,可先将
createdAt截断到秒精度再比较:
select * from contents where date_trunc('second', "createdAt") > '2021-10-18 13:27:01';
内容的提问来源于stack exchange,提问作者alramdein
相关产品推荐
相关产品推荐

