Преобразование локального времени ко времени заданного часового пояса

Функция

Преобразование локального времени ко времени заданного часового пояса.

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

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

    select sysdate,  to_gmtime(sysdate, null);
    |16.08.2010:11:05:20.81|16.08.2010:07:05:20.81|

    Примечание

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

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

    Получить чему соответствует данное локальное время в 3 часовой зоне (Москва):
    select to_GMTIME(to_date('12.45.00', 'hh.mi.ss'), 'gmt+3');
    |00.00.0000:09:45:00.00|
  4. Параметр < временная_зона2 > задает номер часового пояса для летнего времени.

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

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

    Например, узнать, чему соответствует данное локальное время в 3 часовом поясе
     (дата перехода на летнее время 30 марта в 02.00 часа ночи, на зимнее время – 30 октября в 02.00 часа ночи).
    select to_gmtime(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:11:30:00.00|
    
  6. Конструкция DST[< смещение >] задает смещение относительно < временной_зоны1 >.

    select to_gmtime(to_date('14.30.00','hh.mi.ss'),'GMT+3DST+1,M3.5.0/2,M10.5.0/2');
    эквивалентно
    select to_gmcaltime(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. < Смещение > задает нужную часовую зону в прямом или обратном (в зависимости от знака) направлении от локального часового пояса. Допустимое значение в интервале от '-14:00:00' до '+14:00:00'.

    select to_char(sysdate,'hh:mm:ss'),  to_char(to_gmtime(sysdate, 'gmt+10'),'hh:mm:ss');
    |11:08:34|01:08:34|
  9. Синтаксис аргумента < часовой пояс > аналогичен этому же аргументу в функции TO_LOCALTIME.

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

  11. В случае если задана < временная_зона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|
  12. < Дата_перехода_на_летнее время >, < дата_перехода_на_зимнее время > – даты перехода на летнее и на зимнее время соответственно.

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

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

    Примечание

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

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

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

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

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

    select to_gmtime(? (date),? (char(30)));
    30.12.2015:23:00:00
    GMT+3DST+1,M3.5.0/2,M10.5.0/2
    |30.12.2015:20:00:00.00|
  19. Поддерживаются условные наименования временных зон (см. таблицу 6).

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

Возвращаемое значение

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

Примеры
  1. Самолет вылетел из Иркутска 28.12.2007 в 15.45.00 по местному времени (8 часовой пояс) в Воронеж (3 часовой пояс).
    Длительность полета 3 час 47 мин.
    Узнать местное время прибытия самолета.
    select
    'Время отправления: '+
    to_char(to_localtime(to_date('28.12.2007.15.45', 'dd.mm.yyyy.hh.mi'), 'gmt+0'), 'dd.mm.yyyy.hh.mi')
    union
    select  'Время прибытия:    '+
    to_char(to_gmtime(to_localtime(to_date('28.12.2007.15.45', 'dd.mm.yyyy.hh.mi'), 'gmt+0')
    +to_date('03','hh')
    + to_date('47','mi'),'gmt+5'),'dd.mm.yyyy.hh.mi');
    |Время отправления: 28.12.2007.15.45|
    |Время прибытия:    28.12.2007.14.32|
  2. Варианты задания часового пояса Москвы:
    'GMT+03:00:00GMT+04:00:00,M3.5.0/02:00:00,M10.5.0/02:00:00'
    'GMT+3DST+1,M3.5.0/2,M10.5.0/2'
    'GMT+3DST,M3.5.0,M10.5.0'