При использовании Oracle 9.2i мне нужно получить смещение различных дат из одного часового пояса относительно другого часового пояса, ранее я делал это как таковой
select
(TO_DATE('10-Oct-2010 09:00:00','DD-Mon-YYYY HH24:Mi:SS') -
TO_DATE(TO_CHAR(FROM_TZ(to_timestamp( '10-Oct-2010 09:00:00','DD-Mon-YYYY HH24:Mi:SS'), 'Australia/Victoria')
AT TIME ZONE 'Australia/West' , 'DD-Mon-YYYY HH24:Mi:SS'),'DD-Mon-YYYY HH24:Mi:SS'))
from dual
, который, хотя и немного беспорядочно, работал нормально для моегонеобходимо.Теперь проблема в том, что это не учитывает переход на летнее время.Разница во времени между Викторией и Западной Австралией 10 октября составляет фактически 3 часа, а не 2 часа (как в настоящее время возвращает мой запрос).
Теперь это странно, поскольку я думал, что FROM_TZ предназначен для обработки DST.И даже более странно, если я сравниваю с GMT, получаю правильные результаты ..
select FROM_TZ(to_timestamp( '10-Oct-2010 00:00:00','DD-Mon-YYYY HH24:Mi:SS'), 'GMT') AT TIME ZONE 'Australia/West'
from dual
FROM_TZ(TO_TIMESTAMP('10-OCT-2
------------------------------
10-OCT-10 08.00.00.000000000 AM AUSTRALIA/WEST
Правильно
select FROM_TZ(to_timestamp( '10-Oct-2010 00:00:00','DD-Mon-YYYY HH24:Mi:SS'), 'GMT') AT TIME ZONE 'Australia/Victoria'
from dual
FROM_TZ(TO_TIMESTAMP('10-OCT-2
------------------------------
10-OCT-10 11.00.00.000000000 AM AUSTRALIA/VICTORIA
Правильно
select FROM_TZ(to_timestamp( '10-Oct-2010 00:00:00','DD-Mon-YYYY HH24:Mi:SS'), 'Australia/Victoria') AT TIME ZONE 'Australia/West'
from dual
FROM_TZ(TO_TIMESTAMP('10-OCT-2
------------------------------
09-OCT-10 10.00.00.000000000 PM AUSTRALIA/WEST
Неверно.10 октября 2010 г. 00:00:00 утра в Виктории, 09 октября 2010 г., 21:00 вечера в Западной Австралии.
Итак, вопрос в том, является ли это ошибкой?или я просто использую этот FROM_TZ .. В ЗОНЕ ВРЕМЕНИ неправильно?
Спасибо.
Обновление:
Я думаю, это может быть ошибка в функции TO_CHAR, кажетсячтобы получить неправильное смещение TZ.Хотя FROM_TZ может корректно изменить время с GMT на Victoria, при попытке извлечь из него смещение TZ, оно говорит +10, когда оно должно быть + 11.
select TO_CHAR(FROM_TZ(to_timestamp( '10-Oct-2010 00:00:00','DD-Mon-YYYY HH24:Mi:SS'), 'Australia/Victoria'), 'TZH:TZM')
,FROM_TZ(to_timestamp( '10-Oct-2010 00:00:00','DD-Mon-YYYY HH24:Mi:SS'), 'GMT') AT TIME ZONE 'Australia/Victoria'
from dual
TO_CHAR(FROM_TZ(TO_TIMESTAMP(' FROM_TZ(TO_TIMESTAMP('10-OCT-2
--------------------------------------------------------------------------- ------------------------------
+10:00 10-OCT-10 11.00.00.000000000 AM AUSTRALIA/VICTORIA