【问题标题】:Time difference with a field与字段的时差
【发布时间】:2020-08-03 03:13:17
【问题描述】:

我有一个日期字段和一个带 +/- 的时区差异字段。 我要计算当地时间。

示例: (从 UTC 到 LAX)

SCHED_DEP_DATE_BU 20-APR-20 04.20.00.00000000 (这是UTC)

utc_var_dep_hrs -7 (洛杉矶国际机场距离 UTC 为 -7 小时)

当我尝试SCHED_DEP_DATE_BU + utc_var_dep_hrs 时,它将-7 视为天而不是小时,因此结果为13-APR-20。结果应该是19-APR-20 09.20.00.000000

我尝试了各种to_char,但没有任何乐趣。

【问题讨论】:

    标签: sql oracle select timezone


    【解决方案1】:

    一种方法是:

    SCHED_DEP_DATE_BU + utc_var_dep_hrs * INTERVAL '1' HOUR
    

    另一种选择是:

    SCHED_DEP_DATE_BU + utc_var_dep_hrs / 24.0
    

    【讨论】:

      【解决方案2】:

      Gordons 的答案是不错的候选者,或者您可以使用 NUMTODSINTERVAL 函数:

      SCHED_DEP_DATE_BU + NUMTODSINTERVAL(UTC_VAR_DEP_HRS,'hour')
      

      【讨论】:

        【解决方案3】:

        不要只添加/减去固定的小时数,因为当时区更改为/从夏令时更改时,您会得到错误的时间。

        相反,请将您的值存储为 UTC,然后转换为时区,而不是通过添加时间间隔进行转换。为此,您可以使用FROM_TZTIMESTAMP 数据类型转换为TIMESTAMP WITH TIME ZONE 数据类型,然后使用AT TIME ZONE 从一个时区转换为另一个时区:

        SELECT FROM_TZ( sched_dep_date_bu, 'UTC' ) AT TIME ZONE 'PST' AS sched_dep_date_bu_pst
        FROM   table_name;
        

        如果您的数据是:

        INSERT INTO table_name ( sched_dep_date_bu )
        SELECT TIMESTAMP '2020-04-20 04:20:00.00000000' FROM DUAL UNION ALL
        SELECT TIMESTAMP '2020-03-08 09:59:59.00000000' FROM DUAL UNION ALL
        SELECT TIMESTAMP '2020-03-08 10:00:00.00000000' FROM DUAL;
        

        然后您可以将上述输出与仅添加 7 小时进行比较:

        SELECT sched_dep_date_bu - INTERVAL '7' HOUR AS sched_dep_date_bu_7,
               FROM_TZ( sched_dep_date_bu, 'UTC' ) AT TIME ZONE 'PST' AS sched_dep_date_bu_pst
        FROM   table_name;
        

        输出是:

        SCHED_DEP_DATE_BU_7 | SCHED_DEP_DATE_BU_PST :---------------------------- | :-------------------------------- 2020-04-19 21:20:00.000000000 | 2020-04-19 21:20:00.000000000-0700 2020-03-08 02:59:59.000000000 | 2020-03-08 01:59:59.000000000-0800 2020-03-08 03:00:00.000000000 | 2020-03-08 03:00:00.000000000-0700

        db小提琴here

        2020-03-08 02:59:59.000000000 是一个不存在的时间,因为PST 处于 8 小时时差,然后在第一行和第三行进入夏令时。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-18
          • 2020-08-18
          • 2020-05-18
          • 2013-12-03
          • 1970-01-01
          • 1970-01-01
          • 2021-08-16
          • 1970-01-01
          相关资源
          最近更新 更多