Разница во времени с полем - PullRequest
1 голос
/ 20 апреля 2020

У меня есть поле даты и поле разницы часовых поясов с +/-. Я хочу рассчитать местное время.

Пример: (от UT C до LAX)

SCHED_DEP_DATE_BU 20-APR-20 04.20.00.00000000 (Это в UT C)

utc_var_dep_hrs -7 (LAX составляет -7 часов от UT C)

Когда я пытаюсь SCHED_DEP_DATE_BU + utc_var_dep_hrs, , он считает -7 днями, а не часами , и, таким образом, получается 13-APR-20. Результат должен быть 19-APR-20 09.20.00.000000.

Я пробовал разные to_char, но без радости.

Ответы [ 3 ]

0 голосов
/ 20 апреля 2020

Ответы Гордона - хорошие кандидаты, или вы можете использовать функцию NUMTODSINTERVAL:

SCHED_DEP_DATE_BU + NUMTODSINTERVAL(UTC_VAR_DEP_HRS,'hour')
0 голосов
/ 20 апреля 2020

Не просто добавляйте / вычитайте фиксированное количество часов, так как тогда вы получите неправильное время, когда часовой пояс изменится на / из летнего времени.

Вместо этого сохраните ваши значения как UT C а затем преобразовать в часовой пояс, а не преобразование, добавив интервал. Для этого вы можете использовать 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 <> fiddle здесь

2020-03-08 02:59:59.000000000 - это время, которое не существует, поскольку PST было в 8-часовом времени разница, а затем перешел на летнее время для 1-го и 3-го ряда.

0 голосов
/ 20 апреля 2020

Один метод:

SCHED_DEP_DATE_BU + utc_var_dep_hrs * INTERVAL '1' HOUR

Альтернатива:

SCHED_DEP_DATE_BU + utc_var_dep_hrs / 24.0
...