Comment obtenir la colonne d'horodatage en quelques millisecondes à partir de PostgreSQL?

29

J'ai une colonne "créée" avec du type timestamp without time zone default now()dans une base de données PostgreSQL.

Si je sélectionne des colonnes, il a un format agréable et lisible par défaut:

SELECT created FROM mytable;

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

Mais je voudrais obtenir l'horodatage en seulement quelques millisecondes (en long). Quelque chose comme ça:

SELECT myformat (créé) FROM mytable;

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

Comment puis-je obtenir la colonne d'horodatage en quelques millisecondes à partir de PostgreSQL?


Réponse à Jack:

J'obtiens la même différence que vous (-3600), mais si j'utilise timestamp with time zoneje peux voir que l '"erreur" ou la différence est parce que' 1970-01-01 'obtient le fuseau horaire +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 différence est-elle un bug? Je suis peut-être à cause de "l'heure d'été" en ce moment?


Également intéressant lors de l'utilisation to_timestamp()pour insérer les horodatages 0 et 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
la source

Réponses:

35

Utilisation EXTRACTet horodatage UNIX

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

donnerait

1305621628876.94

Multipliez-le par 1000pour le transformer en millisecondes. Vous pouvez ensuite le convertir en ce que vous voulez ( décimal serait un bon choix). N'oubliez pas de garder à l'esprit le fuseau horaire. JackPDouglas a un tel exemple dans sa réponse . Voici un extrait de sa réponse ( createdla colonne avec votre horodatage) qui illustre comment travailler avec les fuseaux horaires:

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

--MODIFIER--

J'ai découvert que (voir ci-dessous) est fondamentalement faux. Voir Comment puis-je obtenir l'horodatage Unix actuel de PostgreSQL? pour la source de ma confusion ...

--END EDIT--

Publication en tant que réponse, car elle ne fonctionnera pas en tant que commentaire.

banc d'essai:

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 |

requêtes:

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

note date_partdans la troisième requête est: 130563 83 28.03266 - 3600 différents.

Jack Douglas
la source