PostgreSQL如何将带时区Timestamp转换为指定时区日期?
解决PostgreSQL按指定时区聚合日期的问题
要获取指定时区对应的日期,核心是先将带时区时间(timestamptz)转换为目标时区的本地时间,再提取日期。针对你的场景,有两种常用写法:
针对示例的直接解决方案
对于你给出的测试语句,只需在原表达式后再追加一次AT TIME ZONE 'Europe/Berlin',即可得到柏林时区对应的日期:
SELECT date('2023-08-01'::timestamp AT TIME ZONE 'Europe/Berlin' AT TIME ZONE 'Europe/Berlin'); -- 输出结果:2023-08-01
针对业务数据的聚合写法
假设你的会计数据表字段为transaction_time timestamptz(带时区的时间),要按用户指定时区(比如Europe/Berlin)分组聚合,写法如下:
SELECT date(transaction_time AT TIME ZONE 'Europe/Berlin') AS local_transaction_date, SUM(amount) AS total_amount FROM accounting_data GROUP BY local_transaction_date ORDER BY local_transaction_date;
原理说明
你之前的写法之所以得到UTC日期,是因为:
'2023-08-01'::timestamp AT TIME ZONE 'Europe/Berlin'将不带时区的时间转换为带时区的UTC时间(2023-07-31 22:00:00+00)- 直接用
date()函数提取时,默认基于UTC时区计算日期,因此得到2023-07-31
而追加第二次AT TIME ZONE 'Europe/Berlin'后,会把UTC的timestamptz转换为柏林时区的本地时间(不带时区的2023-08-01 00:00:00),此时再提取日期就是目标时区的正确日期。
内容的提问来源于stack exchange,提问作者ST-DDT
相关产品推荐
相关产品推荐

