PostgreSQL(Supabase)如何精确匹配timestamptz类型的完整时间值
问题解答
1. 精确查询timestamptz完整时间的方法
完全可以实现精确匹配,你之前查询失败的核心原因是JavaScript的Date类型仅支持毫秒级精度,调用new Date("2021-09-27T20:55:25.625535")时会自动丢弃微秒部分,导致传入Supabase的查询条件本身和数据库存储的完整时间不匹配。
两种可行的精确查询方案:
- 客户端查询时不要将时间转为Date对象,直接传入完整的微秒级时间字符串即可,就是你之前正常生效的写法:
supabase.from("knowledge_views").select("*").eq("modified_at", "2021-09-27T20:55:25.625535")
- SQL层面可以通过转微秒级时间戳的方式匹配:
SELECT * FROM knowledge_views WHERE cast(extract(epoch from modified_at) * 1000000 as bigint) = 1632776125625535;
2. 区间查询的可靠性说明
你当前的加1毫秒方案调整后非常可靠,不需要给下限减1毫秒:
- 首先建议把区间改为左闭右开写法,避免命中恰好等于上限值的边缘记录:
-- 匹配所有前台展示为2021-09-27T20:55:25.625Z的记录 SELECT * FROM knowledge_views WHERE modified_at >= to_timestamp(1632776125.625) AND modified_at < to_timestamp(1632776125.626);
- 不需要调低下限的原因:前台展示的
2021-09-27T20:55:25.625Z是对原始微秒级时间的毫秒位截断结果,对应的真实存储时间范围本来就是[2021-09-27T20:55:25.625000Z, 2021-09-27T20:55:25.625999Z],刚好落在上面的左闭右开区间内,不会漏查也不会多查。
额外补充:Supabase前台展示时隐藏微秒是客户端默认的时间格式化规则导致,数据库底层的timestamptz类型本身保留了完整的微秒精度,不会丢失数据。
内容的提问来源于stack exchange,提问作者AJP
相关产品推荐
相关产品推荐

