Postgres hat nur wenige Arten von Zeitstempeln:
Zeitstempel ohne Zeitzone - (Vorzugsweise zum Speichern von UTC-Zeitstempeln) Sie finden ihn im multinationalen Datenbankspeicher. In diesem Fall kümmert sich der Kunde um den Zeitzonenversatz für jedes Land.
Zeitstempel mit Zeitzone - Der Zeitzonenversatz ist bereits im Zeitstempel enthalten.
In einigen Fällen verwendet Ihre Datenbank die Zeitzone nicht, Sie müssen jedoch Datensätze in Bezug auf die lokale Zeitzone und die Sommerzeit gruppieren (z. B. https://www.timeanddate.com/time/zone/romania/bucharest ).
Um eine Zeitzone hinzuzufügen, können Sie dieses Beispiel verwenden und den Zeitzonenversatz durch Ihren ersetzen.
"your_date_column" at time zone '+03'
Um den für die Sommerzeit spezifischen Versatz von +1 Sommerzeit hinzuzufügen, müssen Sie überprüfen, ob Ihr Zeitstempel in eine Sommerzeit fällt. Da diese Intervalle mit 1 oder 2 Tagen variieren, verwende ich eine Annäherung, die die Aufzeichnungen zum Monatsende nicht beeinflusst. In diesem Fall kann ich jedes Jahr das genaue Intervall ignorieren.
Wenn eine genauere Abfrage erstellt werden muss, müssen Sie Bedingungen hinzufügen, um weitere Fälle zu erstellen. In etwa funktioniert dies jedoch gut, wenn Sie Daten pro Monat in Bezug auf Zeitzone und Sommerzeit aufteilen, wenn Sie einen Zeitstempel ohne Zeitzone in Ihrer Datenbank finden:
SELECT
"id", "Product", "Sale",
date_trunc('month',
CASE WHEN
Extract(month from t."date") > 03 AND
Extract(day from t."date") > 26 AND
Extract(hour from t."date") > 3 AND
Extract(month from t."date") < 10 AND
Extract(day from t."date") < 29 AND
Extract(hour from t."date") < 4
THEN
t."date" at time zone '+03' -- Romania TimeZone offset + DST
ELSE
t."date" at time zone '+02' -- Romania TimeZone offset
END) as "date"
FROM
public."Table" AS t
WHERE 1=1
AND t."date" >= '01/07/2015 00:00:00'::TIMESTAMP WITHOUT TIME ZONE
AND t."date" < '01/07/2017 00:00:00'::TIMESTAMP WITHOUT TIME ZONE
GROUP BY date_trunc('month',
CASE WHEN
Extract(month from t."date") > 03 AND
Extract(day from t."date") > 26 AND
Extract(hour from t."date") > 3 AND
Extract(month from t."date") < 10 AND
Extract(day from t."date") < 29 AND
Extract(hour from t."date") < 4
THEN
t."date" at time zone '+03' -- Romania TimeZone offset + DST
ELSE
t."date" at time zone '+02' -- Romania TimeZone offset
END)