PostgreSQL(DBeaver)WHERE子句:ISO时间转Unix时间戳查询
PostgreSQL毫秒级Unix时间戳与ISO日期匹配查询方案
你的CreatedAt列是存储毫秒级Unix时间戳的int8类型(示例值1659347651689为13位,对应毫秒精度),需要将ISO格式日期时间转换为对应毫秒级时间戳后再匹配,以下是两种可行方案:
方案1:将ISO日期转为毫秒级时间戳(推荐,可利用索引)
通过EXTRACT(EPOCH FROM ...)获取ISO时间的秒级时间戳,再乘以1000转为毫秒,最后转成BIGINT与CreatedAt匹配:
SELECT * FROM table1 WHERE CreatedAt = (EXTRACT(EPOCH FROM TIMESTAMP '2022-08-01 09:54:11.000') * 1000)::BIGINT;
如果你的ISO日期带时区信息,改用TIMESTAMPTZ避免时区偏差:
SELECT * FROM table1 WHERE CreatedAt = (EXTRACT(EPOCH FROM TIMESTAMPTZ '2022-08-01 09:54:11.000+08') * 1000)::BIGINT;
方案2:将时间戳转为日期时间(直观,但可能无法利用索引)
把CreatedAt除以1000转为秒级时间戳,再用TO_TIMESTAMP()转成日期时间类型,直接和ISO字符串比较:
SELECT * FROM table1 WHERE TO_TIMESTAMP(CreatedAt / 1000) = TIMESTAMP '2022-08-01 09:54:11.000';
时间段查询扩展
如果需要匹配某一时间段的记录,用BETWEEN实现范围查询:
SELECT * FROM table1 WHERE CreatedAt BETWEEN (EXTRACT(EPOCH FROM TIMESTAMP '2022-08-01 00:00:00.000') * 1000)::BIGINT AND (EXTRACT(EPOCH FROM TIMESTAMP '2022-08-01 23:59:59.999') * 1000)::BIGINT;
内容的提问来源于stack exchange,提问作者Trina
相关产品推荐
相关产品推荐

