首页 > 解决方案 > redshift 中的 CONVERT_TIMEZONE 产生与预期相反的结果

问题描述

根据 Redshift 文档,语法应如下所示:

CONVERT_TIMEZONE ( ['source_timezone',] 'target_timezone', 'timestamp')

这似乎适用于标准时区名称,但是当源时区指定为 UTC +/- 某些数字时,它似乎无法正常工作。事实上,它似乎只是在倒退。

我正在尝试运行以下查询,例如:

select convert_timezone('UTC','UTC-8','2019-01-01 00:00:0000')

预期的结果是这应该从我的时间戳中减去 8 小时,因为从 UTC(源)到 UTC-8 应该需要 8 小时。相反,它增加了 8 小时,我的结果是2019-01-01 08:00:00.000000. 为什么会这样?或者,转换为命名时区按预期工作:

select convert_timezone('UTC','America/Los_Angeles','2019-01-01 00:00:0000')

此查询正确显示2018-12-31 16:00:00.00000为结果。

那么为什么这个功能是倒退的呢?一个明显的解决方法是向后构造我的查询,但这似乎是一个尴尬的解决方案。而且我只会使用一个命名的时区,但没有一个命名的时区是我所知道的明确的 UTC-8(例如,洛杉矶在 PDT 期间是 GMT-7,所以这不起作用)。

标签: sqlamazon-redshift

解决方案


Redshift 时区偏移与其数学运算符相反。另一种思考方式是相对于自己失去(-)时间并获得(+)时间。如果您从 UTC 时区前往 America/Los_Angeles 时区,时钟会倒退,导致您个人获得(+) 八小时(在阳光下多出一整天!)。


推荐阅读