Postgres 有几种类型的时间戳:
没有时区的时间戳 - (最好存储 UTC 时间戳)您可以在多国数据库存储中找到它。在这种情况下,客户将负责每个国家/地区的时区偏移。
带时区的时间戳 - 时区偏移量已包含在时间戳中。
在某些情况下,您的数据库不使用时区,但您仍然需要根据本地时区和夏令时对记录进行分组(例如https://www.timeanddate.com/time/zone/romania/bucharest)
要添加时区,您可以使用此示例并将时区偏移量替换为您的。
"your_date_column" at time zone '+03'
要添加特定于 DST 的 +1 夏季时间偏移,您需要检查您的时间戳是否属于夏季 DST。由于这些间隔随 1 或 2 天而变化,我将使用不影响月末记录的近似值,因此在这种情况下,我可以忽略每年的确切间隔。
如果必须构建更精确的查询,则必须添加条件以创建更多案例。但粗略地说,当您在数据库中找到没有时区的时间戳时,这可以很好地根据时区和 SummerTime 每月拆分数据:
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)