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.