如何将UTC微秒级BigInt转换为Timestamp并计算时间差?
微秒级BigInt时间戳转Timestamp及秒级时间差计算方案
先说说你之前尝试的问题
- 第一个语句
select to_date(1681149457712377::text, 'YYYYMMDD')完全不对路:to_date是用来解析日期格式字符串的,而你的字段是微秒级的时间戳数值,两者格式不匹配,必然报错。 - 第二个语句的问题是单位换算错了:你除以1000得到的是毫秒,但
TIMESTAMP 'epoch' + 数值 * INTERVAL '1 second'要求数值是秒数,所以应该除以1000000(1e6)才能把微秒转成秒,否则数值过大,得到的自然是离谱的未来日期。
正确的Timestamp转换方法
如果需要把微秒级BigInt转成UTC Timestamp,有两种简单方式:
- 直接用微秒间隔计算:
SELECT TIMESTAMP 'epoch' + 1681149457712377 * INTERVAL '1 microsecond';
- 用
to_timestamp函数(先转成秒的浮点数):
SELECT to_timestamp(1681149457712377 / 1000000.0) AT TIME ZONE 'UTC';
这两种方式都会得到正确的结果:2023-04-10 10:37:37.712377,和你给出的event_date匹配。
直接计算秒级时间差(无需转Timestamp)
你的核心需求是计算两个时间戳的秒级差,其实不用先转成Timestamp,直接对数值做运算更高效:
- 要保留小数(精确到微秒转秒的小数部分):
SELECT (1681149457712377 - 1681101230813726) / 1000000.0 AS seconds_diff;
结果为48226.898651秒。
- 如果只需要整数秒:
SELECT (1681149457712377 - 1681101230813726) // 1000000 AS integer_seconds_diff;
结果为48226秒。
内容的提问来源于stack exchange,提问作者Doug Fir
相关产品推荐
相关产品推荐

