【发布时间】:2023-11-18 22:45:02
【问题描述】:
我通过 Supbase.io 使用 PostgreSQL 13.3。我有一个表,其中包含一个名为 modified_at 的字段,该字段的类型为 timestamptz:
CREATE TABLE IF NOT EXISTS knowledge_views (
id uuid NOT NULL DEFAULT uuid_generate_v4() PRIMARY KEY,
modified_at timestamp with time zone DEFAULT timezone('utc'::text, now()) NOT NULL
);
我有一个条目,其中 modified_at 是:2021-09-27T20:55:25.625Z(编辑:不是,Supabase 目前隐藏了微秒)。以下陈述均无效:
SELECT * FROM knowledge_views WHERE modified_at = timestamptz '2021-09-27T20:55:25.625Z';
SELECT * FROM knowledge_views WHERE modified_at = '2021-09-27T20:55:25.625Z'::timestamptz;
SELECT * FROM knowledge_views WHERE modified_at = to_timestamp(1632776125.625);
SELECT * FROM knowledge_views WHERE modified_at >= to_timestamp(1632776125.625) AND modified_at <= to_timestamp(1632776125.625);
但是,如果执行最后一个查询并将<= 的毫秒数增加一到1632776125.626,那么它会正确找到该行:
SELECT * FROM knowledge_views WHERE modified_at >= to_timestamp(1632776125.625) AND modified_at <= to_timestamp(1632776125.626);
有没有办法通过精确的 timestamptz 值(包括毫秒)来选择一行?
如果这是不可能的,那么将最大毫秒值加 1 的(hacky)方法是否稳健?或者我也应该从最小值减一,例如:>= to_timestamp(1632776125.624) AND modified_at <= to_timestamp(1632776125.626)?
** 编辑 **
使用以下显示该字段实际上以微秒精度存储:
SELECT modified_at as original, cast(extract(epoch from modified_at) * 1000000 as bigint) FROM knowledge_views;
| original | int8 |
|---|---|
| 2021-09-27T20:55:25.625Z | 1632776125625535 |
我意识到它在客户端保持时间戳值字符串不变之前可以工作,即:
supabase.from("knowledge_views").select("*").eq("modified_at", "2021-09-27T20:55:25.625535")
这在我使用时坏了:new Date("2021-09-27T20:55:25.625535") 减少了微秒。
【问题讨论】:
-
您的时区设置为?你在运行社区 PostgreSQL 还是一些 fork?你是怎么安装的?您有哪些非默认设置?什么操作系统和版本?
标签: javascript postgresql timestamp equality supabase