Bagaimana cara mendapatkan kolom cap waktu hanya dalam milidetik dari PostgreSQL?


29

Saya memiliki kolom "dibuat" dengan mengetikkan timestamp without time zone default now()dalam database PostgreSQL.

Jika saya memilih kolom, formatnya bagus dan mudah dibaca per default:

SELECT created FROM mytable;

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

Tapi saya ingin mendapatkan cap waktu hanya dalam milidetik (sebagai Long). Sesuatu seperti ini:

PILIH myformat (dibuat) DARI mytable;

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

Bagaimana saya bisa mendapatkan kolom cap waktu hanya dalam milidetik dari PostgreSQL?


Respon untuk Jack:

Saya mendapatkan perbedaan yang sama dengan Anda (-3600), tetapi jika saya menggunakan timestamp with time zonesaya dapat melihat bahwa "kesalahan" atau perbedaan adalah karena '1970-01-01' mendapatkan zona waktu +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)

Apakah bedanya bug? Saya mungkin karena "waktu musim panas" saat ini?


Juga menarik saat menggunakan to_timestamp()untuk memasukkan stempel waktu 0 dan 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

Jawaban:


35

Gunakan EXTRACTdan UNIX-Timestamp

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

akan memberi

1305621628876.94

Lipat gandakan dengan 1000mengubahnya menjadi milidetik. Anda kemudian dapat mengubahnya menjadi apa pun yang Anda inginkan ( desimal akan menjadi pilihan yang baik). Jangan lupa untuk mengingat zona waktu. JackPDouglas memiliki contoh seperti itu dalam jawabannya . Berikut adalah kutipan dari jawabannya ( createdmenjadi kolom dengan timetamp Anda) yang menggambarkan cara bekerja dengan zona waktu:

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

5

--EDIT--

Saya menemukan ini (lihat di bawah) pada dasarnya salah. Lihat Bagaimana cara mendapatkan cap waktu unix saat ini dari PostgreSQL? untuk sumber kebingungan saya ...

--END EDIT--

Posting sebagai jawaban karena tidak akan berfungsi sebagai komentar.

testbed:

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 |

pertanyaan:

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

catatan date_partdalam permintaan ketiga adalah: 130563 83 28.03266 - 3600 berbeda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.