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