Redshift TIMEZONE函数UTC转EST结果异常求助
Redshift TIMEZONE函数时区转换结果与预期相反问题
我根据Redshift官方文档,预期TIMEZONE函数可以将默认UTC的时间戳转换为指定时区。我确认数据源的time_column列是UTC时区,按照时区规则,UTC应该比EST早5小时,但执行以下查询:
select time_column , timezone('est', time_column) as to_est from my_table order by time_column desc limit 1
得到结果:
| sent_at | to_est |
|---|---|
| 2022-11-15 17:50:26.280 | 2022-11-15 22:50:26.280 |
而预期结果应为:
| sent_at | to_est |
|---|---|
| 2022-11-15 17:50:26.280 | 2022-11-15 12:50:26.280 |
实际结果显示UTC比EST晚5小时,和事实相反,请问为什么会出现这种情况?
问题原因
Redshift的TIMEZONE(tz, timestamp)函数逻辑和你理解的完全相反:它是将输入的timestamp视为tz时区的时间,转换为UTC时间,而非把UTC时间转成tz时区。
你传入的timezone('est', time_column),函数会把time_column里的17:50:26.280当作EST时间,再转成UTC——EST比UTC晚5小时,所以UTC时间就是17+5=22点,这和你得到的结果完全匹配。
正确的转换方式
要把UTC时间转换成EST时区,推荐用两种方法:
- 使用
convert_timezone函数(更直观):
select time_column , convert_timezone('UTC', 'EST', time_column) as to_est from my_table order by time_column desc limit 1
这个函数的参数顺序是convert_timezone(源时区, 目标时区, 时间戳),完全符合常规转换逻辑。
- 调整
TIMEZONE函数的使用方式:
select time_column , timezone('UTC', time_column) at time zone 'EST' as to_est from my_table order by time_column desc limit 1
先通过timezone('UTC', time_column)把UTC时间戳转为带时区的类型,再用at time zone 'EST'转成EST时区的时间。
补充提示
Redshift的TIMEZONE函数参数设计容易造成误解,官方文档明确说明它的作用是将指定时区的时间转成UTC。日常转换优先用convert_timezone,能避免参数顺序搞混的问题。
内容的提问来源于stack exchange,提问作者Arturo Sbr
相关产品推荐
相关产品推荐

