Смещение часового пояса в оракуле - PullRequest
2 голосов
/ 13 октября 2010

При использовании 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 

1 Ответ

1 голос
/ 13 октября 2010

Насколько я могу судить, TZH и TZM - это сокращенные строки часового пояса, но они не учитывают переход на летнее время.Часовой пояс Виктории +10: 00.

Возможно, TZD - это то, что вам нужно.

TZD Информация о летнем времени.Значение TZD представляет собой сокращенную строку часового пояса с информацией о летнем времени.

http://download.oracle.com/docs/cd/B28359_01/olap.111/b28126/dml_commands_1029.htm

select TO_CHAR(FROM_TZ(ts, 'Australia/Victoria'), 'TZH:TZM TZD')
      ,FROM_TZ(ts, 'GMT') AT TIME ZONE 'Australia/Victoria'
from (select to_timestamp( '10-Oct-2010 00:00:00','DD-Mon-YYYY HH24:Mi:SS')
             as ts
      from dual);

+10:00 EST    10/10/2010 10:00:00.000000000 AM +10:00
...