it-swarm.asia

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

Saya memiliki kolom "dibuat" dengan tipe 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 zone Saya 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
31
Jonas

Gunakan EXTRACT dan UNIX-Timestamp

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

akan memberi

1305621628876.94

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

SELECT EXTRACT(Epoch FROM created AT TIME ZONE 'UTC') FROM my_table;
37
DrColossos

--EDIT--

Saya telah 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_part dalam kueri ketiga adalah: 1305638328.03266 - 3600 berbeda.