Postgres có một số loại dấu thời gian:
dấu thời gian không có múi giờ - (Thích lưu trữ dấu thời gian UTC) Bạn tìm thấy nó trong bộ lưu trữ cơ sở dữ liệu đa quốc gia. Khách hàng trong trường hợp này sẽ chăm sóc phần bù múi giờ cho mỗi quốc gia.
dấu thời gian với múi giờ - Phần bù múi giờ đã được bao gồm trong dấu thời gian.
Trong một số trường hợp, cơ sở dữ liệu của bạn không sử dụng múi giờ nhưng bạn vẫn cần nhóm các bản ghi liên quan đến múi giờ địa phương và Giờ tiết kiệm ánh sáng ban ngày (ví dụ: https://www.timeanddate.com/time/zone/romania/buchomon )
Để thêm múi giờ, bạn có thể sử dụng ví dụ này và thay thế bù múi giờ bằng múi giờ của bạn.
"your_date_column" at time zone '+03'
Để thêm bù thời gian mùa hè +1 cụ thể cho DST, bạn cần kiểm tra xem dấu thời gian của bạn có rơi vào DST mùa hè hay không. Vì các khoảng thời gian đó thay đổi trong 1 hoặc 2 ngày, tôi sẽ sử dụng phép tính gần đúng mà không ảnh hưởng đến các bản ghi cuối tháng, vì vậy trong trường hợp này tôi có thể bỏ qua khoảng thời gian chính xác mỗi năm.
Nếu phải xây dựng truy vấn chính xác hơn, thì bạn phải thêm điều kiện để tạo thêm trường hợp. Nhưng đại khái, điều này sẽ hoạt động tốt trong việc chia dữ liệu mỗi tháng liên quan đến múi giờ và SummerTime khi bạn tìm thấy dấu thời gian không có múi giờ trong cơ sở dữ liệu của mình:
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)