Come ottenere la colonna timestamp in soli millisecondi da PostgreSQL?


29

Ho una colonna "creata" con il tipo timestamp without time zone default now()in un database PostgreSQL.

Se seleziono colonne, ha un formato piacevole e leggibile per impostazione predefinita:

SELECT created FROM mytable;

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

Ma vorrei ottenere il timestamp in soli millisecondi (come Long). Qualcosa come questo:

SELEZIONA myformat (creato) DA mytable;

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

Come posso ottenere la colonna timestamp in soli millisecondi da PostgreSQL?


Risposta a Jack:

Ricevo la stessa differenza di te (-3600), ma se lo uso timestamp with time zoneposso vedere che "l'errore" o la differenza è perché "1970-01-01" ottiene il fuso orario +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)

La differenza è un bug? Potrei essere a causa di "Ora legale" al momento?


Interessante anche durante l'utilizzo to_timestamp()per inserire data e ora 0 e 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

Risposte:


35

Utilizzare EXTRACTe il timestamp UNIX

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

darebbe

1305621628876,94

Moltiplicalo 1000per trasformarlo in millisecondi. Puoi quindi convertirlo come preferisci (il decimale sarebbe una buona scelta). Non dimenticare di tenere a mente il fuso orario. JackPDouglas ha un esempio del genere nella sua risposta . Ecco un estratto della sua risposta ( createdessendo la colonna con il tuo calendario) che illustra come lavorare con i fusi orari:

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

5

--MODIFICARE--

Ho scoperto che questo (vedi sotto) è sostanzialmente sbagliato. Vedi Come posso ottenere l'attuale timestamp unix da PostgreSQL? per la fonte della mia confusione ...

--END MODIFICA--

Pubblicare come risposta perché non funzionerà come commento.

banco di prova:

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 |

interrogazioni:

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

la nota date_partnella terza query è: 130563 83 28.03266 - 3600 diversi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.