TIMESTAMP WITHOUT TIME ZONE nach EPOCH
Umwandlung eines TIMESTAMP WITHOUT TIME ZONE in Unix-Epoch
(Sekunden seit 1.1.1970 0 Uhr) in einer Anwendung, die mit UTC-Zeiten
arbeitet:
sql> SELECT EXTRACT(EPOCH FROM TIMESTAMP
'1970-01-01 00:00:00' AT TIME ZONE 'UTC') AS t;
t
---
0
Entscheidend ist hier der Zusatz "AT TIME ZONE 'UTC'", denn ein
TIMESTAMP WITHOUT TIME ZONE wird als Zeit der lokalen Zeitzone
interpretiert - nicht etwa UTC! Ohne den Zusatz ist das Resultat um
dem Offset der lokalen Zeitzone verschoben - böse Falle. Hier das
Ergebnis im Falle von MEZ (+0100):
sql> SELECT EXTRACT(EPOCH FROM TIMESTAMP '1970-01-01 00:00:00') AS t;
t
-------
-3600
Erläuterungen
-
EXTRACT(EPOCH FROM t) extrahiert die Epoch-Sekunden
-
TIMESTAMP '1970-01-01 00:00:00' ist die Zeitangabe t.
-
AT TIME ZONE 'UTC' interpretiert die Zeitangabe t
hinsichtlich Zeitzone UTC.
EPOCH nach TIMESTAMP WITHOUT TIMEZONE
Umwandlung von Epoch-Sekunden in einen TIMESTAMP WITHOUT TIMEZONE
(die 0 steht für den Epoch-Wert):
sql> gkss=# SELECT TIMESTAMP 'epoch' + 0 * INTERVAL '1 second' AS t;
t
---------------------
1970-01-01 00:00:00
Erläuterungen
-
TIMESTAMP 'epoch' bzeichnet den Anfang der Zeitrechnung (1.1.1970 0 Uhr).
-
0 * INTERVAL '1 second' ist der Zeitoffset in Sekunden, der
hinzuaddiert wird. Er kann auch negativ sein.
-
Das Resultat ist ein Timestamp.