Ich habe eine Spalte mit dem Typ timestamp without time zone default now()
in einer PostgreSQL-Datenbank "erstellt".
Wenn ich Spalten auswähle, hat es standardmäßig ein schönes und lesbares Format:
SELECT created FROM mytable;
created
---------------------------
2011-05-17 10:40:28.876944
Aber ich möchte den Zeitstempel in nur Millisekunden (als Long) erhalten. Etwas wie das:
SELECT myformat (erstellt) FROM mytable;
created
-----------------
2432432343876944
Wie kann ich die Zeitstempelspalte in nur Millisekunden von PostgreSQL abrufen?
Antwort an Jack:
Ich bekomme den gleichen Unterschied wie Sie (-3600), aber wenn ich timestamp with time zone
Verwende, kann ich sehen, dass der "Fehler" oder Unterschied darin besteht, dass '1970-01-01' die Zeitzone +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)
Ist der Unterschied ein Fehler? Ich kann im Moment wegen "Sommerzeit" sein?
Interessant auch bei der Verwendung von to_timestamp()
zum Einfügen der Zeitstempel 0 und 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
Verwenden Sie EXTRACT
und den UNIX-Zeitstempel
SELECT EXTRACT(Epoch FROM TIMESTAMP '2011-05-17 10:40:28.876944') * 1000;
würde geben
1305621628876.94
Multipliziere es mit 1000
um es in Millisekunden umzuwandeln. Sie können es dann in alles konvertieren, was Sie wollen ( dezimal wäre eine gute Wahl). Vergessen Sie nicht, die Zeitzone zu berücksichtigen. JackPDouglas hat ein solches Beispiel in seiner Antwort . Hier ist ein Auszug aus seiner Antwort (created
ist die Spalte mit Ihrem Zeitstempel), die zeigt, wie man mit Zeitzonen arbeitet:
SELECT EXTRACT(Epoch FROM created AT TIME ZONE 'UTC') FROM my_table;
--BEARBEITEN--
Ich habe festgestellt, dass dies (siehe unten) grundsätzlich falsch ist. Siehe Wie erhalte ich den aktuellen Unix-Zeitstempel von PostgreSQL? für die Quelle meiner Verwirrung ...
--END EDIT--
Posting als Antwort, da es nicht als Kommentar funktioniert.
prüfstand:
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 |
fragen:
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
hinweis date_part
in der dritten Abfrage lautet: 1305638328.03266 - 3600 verschiedene.