¿Cómo obtener la columna de marca de tiempo en solo milisegundos de PostgreSQL?


29

Tengo una columna "creada" con el tipo timestamp without time zone default now()en una base de datos PostgreSQL.

Si selecciono columnas, tiene un formato agradable y legible por defecto:

SELECT created FROM mytable;

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

Pero me gustaría obtener la marca de tiempo en solo milisegundos (como Long). Algo como esto:

SELECCIONE myformat (creado) DESDE mytable;

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

¿Cómo puedo obtener la columna de marca de tiempo en solo milisegundos de PostgreSQL?


Respuesta a Jack:

Recibo la misma diferencia que usted (-3600), pero si lo uso timestamp with time zone, puedo ver que el "error" o la diferencia se debe a que '1970-01-01' tiene zona horaria +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)

¿Es la diferencia un error? ¿Puedo ser debido a "Horario de verano" en este momento?


También es interesante mientras se usa to_timestamp()para insertar la marca de tiempo 0 y 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

Respuestas:


35

Uso EXTRACTy la marca de tiempo UNIX

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

daría

1305621628876.94

Multiplícalo por 1000para convertirlo en milisegundos. Luego puede convertirlo a lo que desee (el decimal sería una buena opción). No olvides tener en cuenta la zona horaria. JackPDouglas tiene ese ejemplo en su respuesta . Aquí hay un extracto de su respuesta (que createdes la columna con su marca de tiempo) que ilustra cómo trabajar con zonas horarias:

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

5

--EDITAR--

He descubierto que esto (ver más abajo) es básicamente incorrecto. Consulte ¿Cómo obtengo la marca de tiempo de Unix actual de PostgreSQL? por la fuente de mi confusión ...

--END EDITAR--

Publicar como respuesta porque no funcionará como un comentario.

banco de pruebas:

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

nota date_parten la tercera consulta es: 130563 83 28.03266 - 3600 diferentes.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.