J'ai une colonne "créée" avec le 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 zone
Je 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 de 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
Utilisez EXTRACT
et l'horodatage UNIX
SELECT EXTRACT(Epoch FROM TIMESTAMP '2011-05-17 10:40:28.876944') * 1000;
donnerait
1305621628876.94
Multipliez-le par 1000
pour 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 son réponse . Voici un extrait de sa réponse (created
étant la colonne avec votre horodatage) qui illustre comment travailler avec les fuseaux horaires:
SELECT EXTRACT(Epoch FROM created AT TIME ZONE 'UTC') FROM my_table;
--ÉDITER--
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
remarque date_part
dans la troisième requête est: 1305638328.03266 - 3600 différents.