PostgreSQLからミリ秒単位でタイムスタンプ列を取得する方法は?


29

timestamp without time zone default now()PostgreSQLデータベースにtype で「作成」された列があります。

列を選択すると、デフォルトで見やすく読みやすい形式になります。

SELECT created FROM mytable;

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

しかし、私はミリ秒だけでタイムスタンプを取得したい(ロングとして)。このようなもの:

SELECT myformat(created)FROM mytable;

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

PostgreSQLからミリ秒単位でタイムスタンプ列を取得するにはどうすればよいですか?


ジャックへの応答:

私はあなたと同じ違いを取得します(-3600)が、使用するtimestamp with time zoneと、「エラー」または違いは「1970-01-01」がタイムゾーンを取得するためであることがわかります+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

回答:


35

EXTRACTUNIXタイムスタンプの使用

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

与えるだろう

1305621628876.94

乗算し1000てミリ秒に変換します。その後、必要なものに変換できます(10進数が適切な選択です)。タイムゾーンに留意することを忘れないでください。JackPDouglasの答えにはそのような例がありますcreatedタイムゾーンの操作方法を示す彼の回答(タイムスタンプのある列)からの抜粋を以下に示します。

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

5

-編集-

私はこれ(以下を参照)が基本的に間違っていることを発見しました。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_part3番目のクエリの注意:130563 83 28.03266-3600が異なります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.