Como obter a coluna timestamp em apenas milissegundos do PostgreSQL?

29

Eu tenho uma coluna "criada" com o tipo timestamp without time zone default now()em um banco de dados PostgreSQL.

Se eu selecionar colunas, ele terá um formato agradável e legível por padrão:

SELECT created FROM mytable;

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

Mas eu gostaria de obter o carimbo de data e hora em apenas milissegundos (como um longo). Algo assim:

SELECIONAR myformat (criado) FROM mytable;

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

Como posso obter a coluna de carimbo de data e hora em apenas milissegundos do PostgreSQL?


Resposta a Jack:

Eu recebo a mesma diferença que você (-3600), mas se eu usar timestamp with time zone, posso ver que o "erro" ou diferença é porque '01-01-2009' fica com o fuso horário +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)

A diferença é um bug? Eu posso estar por causa de "Horário de verão" no momento?


Também interessante ao usar to_timestamp()para inserir o registro de data e hora 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
Jonas
fonte

Respostas:

35

Use EXTRACTe o carimbo de data / hora UNIX

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

daria

1305621628876.94

Multiplique-o 1000para transformá-lo em milissegundos. Você pode convertê-lo para o que quiser ( decimal seria uma boa escolha). Não se esqueça de manter o fuso horário em mente. JackPDouglas tem esse exemplo em sua resposta . Aqui está um trecho da resposta dele ( createdsendo a coluna com seu cronograma) que ilustra como trabalhar com fusos horários:

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

--EDITAR--

Eu descobri que isso (veja abaixo) está basicamente errado. Veja Como obtenho o registro de data e hora unix atual do PostgreSQL? pela fonte da minha confusão ...

--END EDIT--

Postagem como resposta, porque não funcionará como um comentário.

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 |

consultas:

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

a nota date_partna terceira consulta é: 130563 83 28.03266 - 3600 diferente.

Jack Douglas
fonte