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)