Postgresql

如何在幾毫秒內從 PostgreSQL 獲取時間戳列?

  • May 20, 2020

timestamp without time zone default now()在 PostgreSQL 數據庫中有一個類型為“created”的列。

如果我選擇列,預設情況下它具有良好且可讀的格式:

SELECT created FROM mytable;

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

但我想在幾毫秒內得到時間戳(作為一個長)。像這樣的東西:

從我的表中選擇我的格式(創建);

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

如何在幾毫秒內從 PostgreSQL 獲取時間戳列?


對傑克的回應:

我確實得到了與您相同的差異(-3600),但是如果我使用,timestamp with time zone我可以看到“錯誤”或差異是因為 ‘1970-01-01’ 獲取 time zone +01

create table my_table_2(created timestamp with time zone);
CREATE TABLE
insert into my_table_2 (created) values (now()), ('1970-01-01');
INSERT 0 2
select created, extract(epoch from created) from my_table_2;
           created            |    date_part
-------------------------------+------------------
2011-05-18 11:03:16.909338+02 | 1305709396.90934
1970-01-01 00:00:00+01        |            -3600
(2 rows)

差異是錯誤嗎?我現在可能是因為“夏令時”?


to_timestamp()用於插入時間戳 0 和 1 時也很有趣。

insert into my_table_2 (created) values (to_timestamp(0));
INSERT 0 1

insert into my_table_2 (created) values (to_timestamp(1));
INSERT 0 1
select created, extract(epoch from created) from my_table_2;
           created            |    date_part
-------------------------------+------------------
2011-05-18 11:03:16.909338+02 | 1305709396.90934
1970-01-01 00:00:00+01        |            -3600
1970-01-01 01:00:00+01        |                0
1970-01-01 01:00:01+01        |                1

使用EXTRACT和 UNIX 時間戳

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;

引用自:https://dba.stackexchange.com/questions/2758