如何从 postgres 获取时间戳作为 Unix 纪元?

Posted

技术标签:

【中文标题】如何从 postgres 获取时间戳作为 Unix 纪元?【英文标题】:How to get timestamp as Unix epoch from postgres? 【发布时间】:2011-03-24 15:12:51 【问题描述】:

我想从 Postgres 获取数据。时间戳类型中有一列没有时区。简单的 SELECT 返回我格式化的日期,但我想要以毫秒为单位的时间戳。我如何在 SQL 中做到这一点?

【问题讨论】:

【参考方案1】:
select extract(epoch from my_timestamp)

这会以秒为单位返回时间。但是,它是一个小数点后有小数部分的小数。在下面阅读有关精度的更多信息。

对于毫秒,使用:

select extract(epoch from my_timestamp)*1000

测试:

select my_date, 
extract(epoch from my_date)*interval'1s'+'epoch'::timestamp at time zone 'GMT'

关于精度的说明

extract 返回一个“双精度”数字,它适合 Postgres 中的 15 位数字。这意味着在 2016 年左右(在我写这篇文章时),实际精度为 10 微秒。请注意它如何四舍五入最后一位数字:

select extract('epoch' from '2016-09-20T11:22:33.456789Z'::timestamp);
    date_part     
------------------
 1474370553.45679
(1 row)

对于未来 270 年这样的日期,这种数据类型只能表示 100 微秒的精度。从 2016 年的角度来看,这似乎是一个不错的精度,我想在我们到达那一年之前情况可能会有所改变。

select extract('epoch' from '2290-09-20T11:22:33.456789Z'::timestamp);
    date_part     
------------------
 10120936953.4568
(1 row)

无论哪种方式,它都会在毫秒精度下继续工作一段时间。

【讨论】:

如果您需要毫秒精度,此建议无济于事 @Wiebke 确实如此。看看更新后的答案是否能更好地解释它。

以上是关于如何从 postgres 获取时间戳作为 Unix 纪元?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 jsonb 列中的 unix 整数设置 postgres 时间戳列?

如何将 C 中的 unix 时间戳作为 int 获取?

在 postgres 中,如何从事件日志类型表(具有时间戳)中获取特定时间范围内字段的总和(或汇总)

如何从 JS 中的 Y-m-d 日期获取 unix 时间戳?

如何从给定城市的给定日期和时间获取 unix 纪元时间戳(以秒为单位)?

使用 node-postgres 在 utc 中获取 Postgres“没有时区的时间戳”