it-swarm.it

Come ottenere la colonna timestamp in soli millisecondi da PostgreSQL?

Ho una colonna "creata" con 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 tua stessa differenza (-3600), ma se uso timestamp with time zone Vedo 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 quando si utilizza 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
31
Jonas

Usa EXTRACT e il timestamp UNIX

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

darebbe

1305621628876,94

Moltiplicalo per 1000 per trasformarlo in millisecondi. Puoi quindi convertirlo come preferisci ( decimale sarebbe una buona scelta). Non dimenticare di tenere presente il fuso orario. JackPDouglas ha un esempio del genere nel suo risposta . Ecco un estratto della sua risposta (created è 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;
37
DrColossos

--MODIFICARE--

Ho scoperto che questo (vedi sotto) è sostanzialmente sbagliato. Vedi Come posso ottenere l'attuale timestamp unix da PostgreSQL? per l'origine 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

nota date_part nella terza query è: 1305638328.03266 - 3600 diversi.