【问题标题】: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_TZ 将TIMESTAMP 数据类型转换为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 小时时差,然后在第一行和第三行进入夏令时。