Преобразование метки времени UTC в AEDT в Oracle для перехода на летнее время

#oracle #timezone

#Oracle #Часовой пояс

Вопрос:

Преобразование из UTC в AEST (австралийское восточное стандартное время) не учитывает переход на летнее время, поскольку сейчас 11 часов, но этот скрипт все равно преобразует с 10 часами :

 Select from_tz (cast(DateField as TIMESTAMP),'UTC') at Time Zone 'Australia/Sydney' as AEST
 

Есть ли какой-нибудь интуитивно понятный способ сделать это 11 часов летом и 10 часов зимой без необходимости создавать функцию и жестко кодировать ее?

Ответ №1:

Не уверен, как вы определили, что ваша формула «не учитывает переход на летнее время». Это происходит в моей системе. Обратите внимание, что date литерал предполагает, что время суток — полночь. Затем сравните:

 select from_tz (cast(datefield as timestamp),'UTC') 
       at time zone 'Australia/Sydney' as aest
from   ( select date '2020-07-31' as datefield from dual union all
         select date '2020-12-15'              from dual
       )
;
        
AEST                                
------------------------------------
2020-07-31 10:00:00 Australia/Sydney
2020-12-15 11:00:00 Australia/Sydney
 

Очевидно, что Oracle осознает разницу между «летним» и «зимним» временем (корректировка DST).