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)