我想从Postgres获取数据.时间戳类型中有一列没有时区.简单的SELECT返回格式化日期,但我想简单地以毫秒为单位的时间戳.我怎么能在SQL中做到这一点?
select extract(epoch from my_timestamp)
Run Code Online (Sandbox Code Playgroud)
以秒为单位返回时间.但是,它是一个十进制数,小数点后的第二个分数.详细了解下面的精度.
对于millis,使用:
select extract(epoch from my_timestamp)*1000
Run Code Online (Sandbox Code Playgroud)
测试:
select my_date,
extract(epoch from my_date)*interval'1s'+'epoch'::timestamp at time zone 'GMT'
Run Code Online (Sandbox Code Playgroud)
注意精度
extract返回一个"双精度"数字,在Postgres中适合15位数.这意味着在2016年左右(我写这篇文章),实际精度是10微秒.请注意它如何舍入最后一位数:
select extract('epoch' from '2016-09-20T11:22:33.456789Z'::timestamp);
date_part
------------------
1474370553.45679
(1 row)
Run Code Online (Sandbox Code Playgroud)
对于未来270年的日期,此数据类型只能表示100微秒的精度.从2016年的角度来看,这似乎是一个不错的精确度,我想在我们达到那一年之前,情况可能会有所改变.
select extract('epoch' from '2290-09-20T11:22:33.456789Z'::timestamp);
date_part
------------------
10120936953.4568
(1 row)
Run Code Online (Sandbox Code Playgroud)
无论哪种方式,它将继续工作一段时间内毫秒精度.