Преобразование времени по Гринвичу к локальному времени

Функция

Преобразование времени по Гринвичу к локальному времени.

Спецификация
 
< синтаксис >::=
< временная_зона1 >::=
< временная_зона2 >::=
< смещение >::=
'[+|-]hh[:mm[:ss]]'
< время >::=
'[+|-]hh[:mm[:ss]]'
< дата_перехода_на_летнее время >::=
< дата_перехода_на_зимнее время >::=
< месяц >::=
1-12
< неделя >::=
1-5
< день_недели >::=
0-6
Синтаксические правила
  1. < Дата-время выражение > – значение, воспринимаемое как дата (время) нулевого часового пояса (по Гринвичу).

  2. Если аргумент < часовой пояс > равен NULL или не задан, то по умолчанию преобразование выполняется к часовому поясу, установленному на компьютере.

    select to_localtime(to_date('12.45.00', 'hh.mi.ss'));
    |00.00.0000:16:45:00.00|

    Примечание

    В данном случае результат может оказаться неверным, т.к. для формирования времени функция использует текущее значение флага летнего времени в ОС, а не то, которое должно соответствовать дате, указанной в качестве аргумента < дата-время выражение >.

  3. Параметр < временная_зона1 > задает номер часового пояса для зимнего времени.

    Получить зимнее локальное время в 3 часовой зоне (Москва):
    select to_localtime(to_date('12.45.00', 'hh.mi.ss'), 'gmt+3');
    |00.00.0000:15:45:00.00|

  4. Параметр < временная_зона2 > задает номер часового пояса для летнего времени. Обычно отличается от < временной_зоны1 > на 1 час, т.е. < временная_зона2 >=< временная_зона1 >+1.

  5. Для получения летнего времени необходимо указать дату и, при необходимости, время перехода на летнее и на зимнее время в этом часовом поясе.

    Например, узнать локальное летнее время в 3 часовом поясе (дата перехода на
     летнее время 30 марта в 02.00 часа ночи, на зимнее 30 октября в 02.00 часа ночи):
    select to_localtime(to_date('14.30.00','hh.mi.ss'),' GMT+3:00:00  GMT+04:00:00,
     M3.5.0/2:00:00, M10.5.0/02:00:00 ');
    |00.00.0000:17:30:00.00|
    
    select to_localtime(to_date('28.05.2012','DD.MM.YYYY'),
    'GMT+3DST+1,M3.5.0/2,M10.5.0/2');

  6. Конструкция DST[< смещение >] задает смещение относительно < временной_зоны1 >.

    select to_localtime
     (to_date('14.30.00','hh.mi.ss'),'GMT+3DST+1,M3.5.0/2,M10.5.0/2');
    эквивалентно
    select to_localtime(to_date('14.30.00','hh.mi.ss'),' GMT+3:00:00  GMT+04:00:00,
     M3.5.0/2:00:00, M10.5.0/02:00:00 ');
    |00.00.0000:17:30:00.00|

  7. Если задана только < временная_зона1 >, а < временная_зона2 > не задана, то подразумевается, что переход на летнее/зимнее время отсутствует.

  8. В случае если задана < временная_зона2 >, но не задано < смещение > для 'GMT' или < смещение > для 'DST', подразумевается, что оба эти смещения отличаются от < смещения > из < временной_зоны1 > на 1 час.

    select to_char(sysdate,'hh:mm:ss'),
    to_char(to_gmtime(sysdate, 'GMT+3'),'hh:mm:ss'),
    to_char(to_gmtime(sysdate, 'GMT+3 GMT,M3.5.0,M10.5.0'),'hh:mm:ss');
    |11:08:44|08:08:44|07:08:44|

  9. < Смещение > задает нужную часовую зону в прямом или обратном (в зависимости от < знака >) направлении от Гринвичского меридиана. Допустимое значение в интервале от '-14:00:00' до '+14:00:00'.

    select to_char(sysdate,'hh:mm:ss'),
    to_char(to_localtime(sysdate, 'gmt+10'),'hh:mm:ss');
    |09:08:36|19:08:36|
  10. Знаки пробела игнорируются как внутри < смещения >, так и между элементами GMT, < знак > и < смещение >.

    select to_localtime(to_date('31.12.2125','DD.MM.YYYY'),'gmt + 1 1 ');
    |31.12.2125:11:00:00.00|
  11. Знак положительного смещения можно не задавать (используется по умолчанию).

    select to_localtime(to_date('31.12.2125','DD.MM.YYYY'),'GMT4');
    |31.12.2125:04:00:00.00|
  12. Префикс GMT регистронезависим.

    select to_localtime(to_date('31.12.2125','DD.MM.YYYY'),'GmT-1');
  13. Префикс M регистрозависим.

    Правильная конструкция
    select to_localtime(to_date('14.30.00','hh.mi.ss'),'GMT+3DST,M3.5.0,M10.5.0');
    Неправильная конструкция
    select to_localtime(to_date('14.30.00','hh.mi.ss'),'GMT+3DST,m3.5.0,m10.5.0');
  14. Нули внутри конструкции < часовой пояс > игнорируются, т.е. 'GMT3' равнозначно GMT +03 '.

  15. < Дата_перехода_на_летнее время >, < дата_перехода_на_зимнее время > – даты перехода на летнее и на зимнее время соответственно.

  16. < Время > – время перехода на летнее или на зимнее время. Если оно не задано, по умолчанию используется значение '02:00:00'.

  17. Знак '+' у < смещения > означает, что часовой пояс лежит к востоку от Гринвича, '-' – к западу от Гринвича.

    Примечание

    Часовой пояс Москвы '+3'/'+4' для зимнего/летнего времени соответственно.

  18. В параметре < неделя > число 5 означает последний день недели в месяце, даже если в месяце всего 4 таких дня недели.

  19. В параметре < день > отсчет дней начинается с воскресенья, т.е. 0 – воскресенье.

  20. Сумма смещений из < временной_зоны1 > и конструкции DST < смещение > должна находиться в интервале от '-14:00:00' до '+14:00:00'.

  21. Аргументы могут быть заданы < SQL-параметром >, который должен содержать спецификацию типа данных параметра.

    select to_localtime(? (date),? (char(10)));
    30.12.2015:23:00:00
    GMT-2
    |30.12.2015:21:00:00.00|
  22. Поддерживаются следующие условные наименования временных зон (таблица 6).

    Таблица 6. Условные наименования временных зон
    Условное наименованиеЗначениеКомментарий
    ASTGMT-4Atlantic Standard Time
    ADTGMT-3Atlantic Daylight Time
    BSTGMT-11Bering Standard Time
    BDTGMT-10Bering Daylight Time
    CSTGMT-6Central Standard Time
    CDTGMT-5Central Daylight Time
    ESTGMT-5Eastern Standard Time
    EDTGMT-4Eastern Daylight Time
    HSTGMT-10Alaska-Hawaii Standard Time
    HDTGMT-9Alaska-Hawaii Daylight Time
    MSTGMT-7Mountain Standard Time
    MDTGMT-6Mountain Daylight Time
    NSTGMT-3.5Newfoundland Standard Time
    PSTGMT-8Pacific Standard Time
    PDTGMT-7Pacific Daylight Time
    YSTGMT-9Yukon Standard Time
    YDTGMT-8Yukon Daylight Time


    Для всех временных зон используются те же максимальное и минимальное смещение, что и для GMT: от '-14:00:00' до '+14:00:00'.

    select to_gmtime(to_date('01.01.2015 00:00','DD.MM.YYYY HH:MI'),'HST+0');
    |31.12.2014:14:00:00.00|
    
    select to_gmtime(to_date('01.01.2015 00:00','DD.MM.YYYY HH:MI'),? (char(10)));
    YDT+5
    |31.12.2014:11:00:00.00|

Общие правила
  1. Интервал времени между GMT и локальным временем вычисляется заново через каждые 30 секунд.

  2. Если в момент выполнения функции происходит перевод времени (например, времени местного московского 2009-03-29* 02*:00:00 уже не существует), то возвращается ближайшее существующее.

    select '2009-03-28 23:00' "gmt",TO_LOCALTIME(to_date('2009-03-28 23:00','YYYY-MM-DD HH:MI'),'GMT+3DST,M3.5.0,M10.5.0');
    gmt
     ---
    |2009-03-28 23:00|29.03.2009:03:00:00.00|
Возвращаемое значение

Значение типа DATE, преобразованное из даты по Гринвичу в локальную дату (время) заданного часового пояса в летний или зимний период времени.

Примеры
  1. Получить разницу в часовых поясах между местным временем и временем по Гринвичу:

    select datesplit(to_localtime(sysdate),'hh') - datesplit(sysdate,'hh');
    |    3|
  2.  

    select to_localtime(to_date('31.12.2125','DD.MM.YYYY'),'GMT-1');
    |30.12.2125:23:00:00.00|
  3.  

    select to_localtime(to_date('31.12.2125','DD.MM.YYYY'),'GMT+10')
    union all
    select to_localtime(to_date('31.12.2125','DD.MM.YYYY'),'GMT10');
    |31.12.2125:10:00:00.00|
    |31.12.2125:10:00:00.00|
  4. Переход на зимнее время:

    select to_localtime(to_date('27.03.2010','DD.MM.YYYY'),' GMT+3:00:00  GMT+04:00:00, M3.5.0/2:00:00, M10.5.0/02:00:00 ');
    |27.03.2010:03:00:00.00|
    select to_localtime(to_date('27.03.2010','DD.MM.YYYY'),'GMT+3DST+1,M3.5.0/2,M10.5.0/2');
    
    select to_localtime(to_date('27.03.2010','DD.MM.YYYY'),'GMT+3GMT,M3.5.0,M10.5.0');