【问题标题】:NUMTODSINTERVAL in Redshift. Convert a number to hoursRedshift 中的 NUMTODSINTERVAL。将数字转换为小时
【发布时间】:2018-09-15 05:43:20
【问题描述】:

我的目标是偏移表 Date_times 中的时间戳以反映本地时区。我有一个用于此的 Timezone_lookup 表,它有一个 utc_convert 列,其值是(2、-1、5 等),具体取决于时区。

我曾经在 Oracle 中使用 NUMTODSINTERVAL 能够将 utc_convert 值转换为小时,这样我就可以在 Date_times 表中添加/减去日期时间。

对于 Redshift,我找到了 INTERVAL,但这只是用特定数字硬编码偏移量。

我也试过了:

SELECT CAST(utc as TIME) 
 FROM(
  SELECT *
  ,to_char(cast(utc_convert as int)||':00:00', 'HH24') as utc
from Timezon_lookup
)

但这不起作用,因为 utc_convert 列中的某些数字具有负值。有什么想法吗?

【问题讨论】:

    标签: sql oracle timezone amazon-redshift timezone-offset


    【解决方案1】:

    您是否尝试过将偏移量乘以一个区间:

    select current_timestamp + utc_convert * interval '1 hour'
    

    【讨论】:

    • 这是天才!!它工作得很好,而且它是一个简单的代码。非常感谢
    【解决方案2】:

    在 Oracle 中,您可以使用用户会话的时区(这意味着您不需要维护时区查找表或补偿夏令时)。

    SELECT FROM_TZ( your_timestamp_column, 'UTC' ) AT LOCAL
    FROM   Date_times
    

    SQLFIDDLE

    在 RedShift 中,您应该能够使用 CONVERT_TIMEZONE( ['source_timezone',] 'target_timezone', 'timestamp') 函数,而不是添加多个间隔。这将允许您将 target_timezone 指定为与​​ UTC 的数字偏移量或时区名称(将自动补偿 DST)。

    【讨论】:

    • 这不是有效的红移语法。
    • @JonScott 这是有效的 Oracle SQL,问题标记为 Oracle,OP 提到使用 Oracle 查询。
    • 好吧,但我认为 Op 想要将 oracle 转换为 redshift :) “我曾经在 Oracle 中使用 NUMTODSINTERVAL”是赠品。
    • @JonScott 我进行了编辑以使其更清楚地表明它是 Oracle 的答案 - 但希望 RedShift 中有类似的功能,因为尝试实现自己的功能来转换时区是制造巨大混乱(尤其是夏令时)。
    • 非常感谢,伙计们。是的,如果我造成任何混乱,我很抱歉。我的意思是从 Oracle 转换为 redshift。 @JonScott 的回答解决了问题
    猜你喜欢
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多