Postgres にはいくつかの種類のタイムスタンプがあります。
タイムゾーンなしのタイムスタンプ- (UTC タイムスタンプを保存することをお勧めします) 多国籍データベース ストレージにあります。この場合、クライアントは各国のタイムゾーン オフセットを処理します。
タイムゾーン付きタイムスタンプ- タイムゾーン オフセットはすでにタイムスタンプに含まれています。
場合によっては、データベースがタイムゾーンを使用していなくても、ローカル タイムゾーンと夏時間に関してレコードをグループ化する必要があります (例: https://www.timeanddate.com/time/zone/romania/bucharest ) 。
タイムゾーンを追加するには、この例を使用して、タイムゾーン オフセットを自分のものに置き換えます。
"your_date_column" at time zone '+03'
DST に固有の +1 サマータイム オフセットを追加するには、タイムスタンプが夏 DST に該当するかどうかを確認する必要があります。これらの間隔は 1 日または 2 日で変化するため、月末の記録に影響を与えない近似を使用するため、この場合、毎年の正確な間隔を無視できます。
より正確なクエリを作成する必要がある場合は、条件を追加してさらにケースを作成する必要があります。しかし、大まかに言えば、データベースでタイムゾーンのないタイムスタンプを見つけた場合、タイムゾーンとサマータイムに関して月ごとにデータを分割する場合、これはうまく機能します。
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)