Umgang mit Daten während der Zeitumstellung

Hallo zusammen,

ich zeichne in einer Tabelle Energiezähler im Minutentakt auf, welche mit versch. Aggregatsfunktionen weiterverarbeitet werden. Die Zeit wird mit dem Typ timestamptz aufgezeichnet. Nun stelle ich mir die Frage, wie ich am Besten mit Werten während der Zeitumstellung umgehe. Im Frühjahr fehlt mir eine Stunde, im Herbst habe ich 1 Stunde zu viel an Werten.

Auch wenn ich Werte wie z. B. Temperaturen aufzeichne, habe ich im Frühjahr im Chart eine Lücke, im Herbst doppelte Werte.

Wie macht ihr das?

Wenn der Datentyp timestamptz ist, ist das kein Problem, denn das ist ein absoluter Timestamp.
Ich würde bei der Auswertung den Parameter timestamp in der Datenbanksession auf UTC stellen, dann kriegt man die Werte in dieser Zeitzone, und das Problem verschwindet.

Danke für den Hinweis. Ich glaub, dass ich mir das mit den Zeitzonen noch einmal genauer ansehen muss. Denke hier vielleicht einfach zu kompliziert.

Das ist eigentlich ganz einfach. Hier ist ein Beispiel:

CREATE TABLE messung (
   id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
   wann timestamp with time zone NOT NULL,
   wert double precision NOT NULL
);

Mein Energiezähler sitzt in Wien:

SHOW timezone;

   TimeZone    
═══════════════
 Europe/Vienna
(1 row)

Er fügt jetzt jede Stunde einen Wert ein, mit dem lokalen Timestamp:

INSERT INTO messung (wann, wert) VALUES ('2024-03-30 22:30:00', 1);
INSERT INTO messung (wann, wert) VALUES ('2024-03-30 23:30:00', 2);
INSERT INTO messung (wann, wert) VALUES ('2024-03-31 00:30:00', 3);
INSERT INTO messung (wann, wert) VALUES ('2024-03-31 01:30:00', 4);
-- hier springt die Uhr
INSERT INTO messung (wann, wert) VALUES ('2024-03-31 03:30:00', 5);
INSERT INTO messung (wann, wert) VALUES ('2024-03-31 04:30:00', 6);

Das schaut mit timezone = 'Europe/Vienna' so aus:

TABLE messung;

 id │          wann          │ wert 
════╪════════════════════════╪══════
  1 │ 2024-03-30 22:30:00+01 │    1
  2 │ 2024-03-30 23:30:00+01 │    2
  3 │ 2024-03-31 00:30:00+01 │    3
  4 │ 2024-03-31 01:30:00+01 │    4
  5 │ 2024-03-31 03:30:00+02 │    5
  6 │ 2024-03-31 04:30:00+02 │    6
(6 rows)

Aber wenn ich timezone auf UTC stelle, ist das Problem verschwunden:

SET timezone = 'UTC';

TABLE messung;

 id │          wann          │ wert 
════╪════════════════════════╪══════
  1 │ 2024-03-30 21:30:00+00 │    1
  2 │ 2024-03-30 22:30:00+00 │    2
  3 │ 2024-03-30 23:30:00+00 │    3
  4 │ 2024-03-31 00:30:00+00 │    4
  5 │ 2024-03-31 01:30:00+00 │    5
  6 │ 2024-03-31 02:30:00+00 │    6
(6 rows)

Das einzig mögliche Problem ist beim Umstellen in die andere Richtung, weil 2:30 dann keine eindeutige Angabe ist. Aber auch dieses Problem liegt nur an der String-Repräsentation. Wenn man die Spalte mit DEFAULT current_timestamp definiert und den Defaultwert verwendet, passiert auch hier nichts.

1 „Gefällt mir“

Danke für die ausführliche Beschreibung. Bin von deinem Engagement begeistert!

Ich werde mir das, anhand meines Testaufbaus, noch einmal genauer anschauen und probieren.
Vielen Dank nochmals!!

1 „Gefällt mir“

Ich habe mir das Ganze noch einmal überlegt. Angenommen ich zeichne von einen Motor (welcher ununterbrochen läuft) den Betriebsstundenzähler stündlich in die Datenbank. Dann hätte ich im Frühjahr bei der Zeitumstellung einen Tag mit nur 23 Betriebsstunden und im Herbst dann eben 25 Betriebsstunden. Das muss dann aber auch so sein, da ja die Tage unterschiedlich lange dauern. Gleich ist es dann auch bei Energiezählern.

Das Arbeiten mit UTC würde mir wahrscheinlich nichts bringen, da ich dann die Abfrage um eine Stunde verschiebe und so die Berechnung z. B. eines Tageswertes nicht mehr exakt zum gewünschten Tag passt.

Ich habe als DEFAULT NOW() eingestellt. Somit sollte die Aufzeichnung immer genau sein.

Dankeschön!

Ich kann verstehen, daß UTC als Zeitzone nicht sinnvoll ist.
Dann haben halt manchmal Tage 23 oder 25 Stunden, auch wenn das in der Auswertung komisch ist.

Mit now() (was dasselbe ist wie current_timestamp, nur nicht standardkonform) kann nichts schiefgehen.

Danke Laurenz für dein Bemühen. Ich habe jetzt auch noch einmal die Aufzeichnung eines Energiemanagementsystems geprüft und da ist es auch gleich. Das heißt im Frühjahr fehlt einfach eine Stunde und im Herbst ist 02:00-03:00 doppelt enthalten.

Meine Frage ist somit beantwortet!