我在PostgreSQL数据库中有一个类型为timestamp without time zone default now()的“创建”列。

如果我选择列,则默认情况下它具有很好的可读格式:
>
但是我想仅以毫秒为单位获取时间戳(以Long为单位)。这样的事情:

从mytable中选择myformat(创建的);


对杰克的回应:

我确实得到了与您相同的区别(-3600),但是如果我使用timestamp with time zone,我可以看到“错误”或差异是因为'1970-01-01'获得时区+01

SELECT created FROM mytable;

         created
---------------------------
2011-05-17 10:40:28.876944


差异是否是错误?我现在可能是因为“夏令时”吗?


在使用to_timestamp()插入时间戳0和1时也很有趣。

     created
-----------------
2432432343876944


#1 楼

使用EXTRACT和UNIX-Timestamp

SELECT EXTRACT(EPOCH FROM TIMESTAMP '2011-05-17 10:40:28.876944') * 1000;


将给出



1305621628876.94


>将其乘以1000,将其转换为毫秒。然后,您可以将其转换为所需的任何内容(十进制是个不错的选择)。不要忘记记住时区。 JackPDouglas在回答中有这样的例子。以下是他的回答的摘录(created是带有时间戳的列),说明了如何使用时区:

SELECT EXTRACT(EPOCH FROM created AT TIME ZONE 'UTC') FROM my_table;


#2 楼

--EDIT--

我发现这基本上是错误的。请参阅如何从PostgreSQL获取当前的unix时间戳?引起我困惑的原因...

-结束编辑-

将其发布为答案,因为它不能用作注释。

测试台:

create role stack;
grant stack to dba;
create schema authorization stack;
set role stack;

create table my_table(created timestamp);
insert into my_table(created) values(now()),('1970-01-01');
\d my_table
              Table "stack.my_table"
 Column  |            Type             | Modifiers
---------+-----------------------------+-----------
 created | timestamp without time zone |


查询:

select created, extract(epoch from created) from my_table;

          created          |    date_part
---------------------------+------------------
 2011-05-17 13:18:48.03266 | 1305634728.03266
 1970-01-01 00:00:00       |            -3600


select created, extract(epoch from date_trunc('milliseconds', created)) 
from my_table;

          created          |    date_part
---------------------------+------------------
 2011-05-17 13:18:48.03266 | 1305634728.03266
 1970-01-01 00:00:00       |            -3600


select created, extract(epoch from created at time zone 'UTC') from my_table;

          created          |    date_part
---------------------------+------------------
 2011-05-17 13:18:48.03266 | 1305638328.03266
 1970-01-01 00:00:00       |                0


第三个查询中的date_part是:1305638328.03266 -3600种不同。

#3 楼

我知道这是一篇过时的文章,但是看到我现在有同样的问题,并且正在引用类似本文的内容,也许我的回答对其他人可能很有价值:您正在查询的时间戳:
:: timestamptz(3)

这将过滤精度,仅检索/匹配毫秒->

例如,我在JS中的SQL解决方案现在可以正常工作,如下所示:

`SELECT * FROM public.reports WHERE id::timestamptz(3) = '${dateRequested}';`