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)