Преобразование времени по Гринвичу к локальному времени
Функция
Преобразование времени по Гринвичу к локальному времени.
Спецификация
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
Синтаксические правила
-
< Дата-время выражение >
– значение, воспринимаемое как дата (время) нулевого часового пояса (по Гринвичу). -
Если аргумент
< часовой пояс >
равен NULL или не задан, то по умолчанию преобразование выполняется к часовому поясу, установленному на компьютере.select to_localtime(to_date('12.45.00', 'hh.mi.ss')); |00.00.0000:16:45:00.00|
Примечание
В данном случае результат может оказаться неверным, т.к. для формирования времени функция использует текущее значение флага летнего времени в ОС, а не то, которое должно соответствовать дате, указанной в качестве аргумента
< дата-время выражение >
. -
Параметр
< временная_зона1 >
задает номер часового пояса для зимнего времени.Получить зимнее локальное время в 3 часовой зоне (Москва): select to_localtime(to_date('12.45.00', 'hh.mi.ss'), 'gmt+3'); |00.00.0000:15:45:00.00|
-
Параметр
< временная_зона2 >
задает номер часового пояса для летнего времени. Обычно отличается от< временной_зоны1 >
на 1 час, т.е.< временная_зона2 >
=< временная_зона1 >
+1. -
Для получения летнего времени необходимо указать дату и, при необходимости, время перехода на летнее и на зимнее время в этом часовом поясе.
Например, узнать локальное летнее время в 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');
-
Конструкция 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|
-
Если задана только
< временная_зона1 >
, а< временная_зона2 >
не задана, то подразумевается, что переход на летнее/зимнее время отсутствует. -
В случае если задана
< временная_зона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|
-
< Смещение >
задает нужную часовую зону в прямом или обратном (в зависимости от< знака >
) направлении от Гринвичского меридиана. Допустимое значение в интервале от '-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|
-
Знаки пробела игнорируются как внутри
< смещения >
, так и между элементами GMT,< знак >
и< смещение >
.select to_localtime(to_date('31.12.2125','DD.MM.YYYY'),'gmt + 1 1 '); |31.12.2125:11:00:00.00|
-
Знак положительного смещения можно не задавать (используется по умолчанию).
select to_localtime(to_date('31.12.2125','DD.MM.YYYY'),'GMT4'); |31.12.2125:04:00:00.00|
-
Префикс GMT регистронезависим.
select to_localtime(to_date('31.12.2125','DD.MM.YYYY'),'GmT-1');
-
Префикс 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');
-
Нули внутри конструкции
< часовой пояс >
игнорируются, т.е. 'GMT3' равнозначно GMT +03 '. -
< Дата_перехода_на_летнее время >
,< дата_перехода_на_зимнее время >
– даты перехода на летнее и на зимнее время соответственно. -
< Время >
– время перехода на летнее или на зимнее время. Если оно не задано, по умолчанию используется значение '02:00:00'. -
Знак '+' у
< смещения >
означает, что часовой пояс лежит к востоку от Гринвича, '-' – к западу от Гринвича.Примечание
Часовой пояс Москвы '+3'/'+4' для зимнего/летнего времени соответственно.
-
В параметре
< неделя >
число 5 означает последний день недели в месяце, даже если в месяце всего 4 таких дня недели. -
В параметре
< день >
отсчет дней начинается с воскресенья, т.е. 0 – воскресенье. -
Сумма смещений из
< временной_зоны1 >
и конструкции DST< смещение >
должна находиться в интервале от '-14:00:00' до '+14:00:00'. -
Аргументы могут быть заданы
< SQL-параметром >
, который должен содержать спецификацию типа данных параметра.select to_localtime(? (date),? (char(10))); 30.12.2015:23:00:00 GMT-2 |30.12.2015:21:00:00.00|
-
Поддерживаются следующие условные наименования временных зон (таблица 6).
Таблица 6. Условные наименования временных зонУсловное наименование Значение Комментарий AST GMT-4 Atlantic Standard Time ADT GMT-3 Atlantic Daylight Time BST GMT-11 Bering Standard Time BDT GMT-10 Bering Daylight Time CST GMT-6 Central Standard Time CDT GMT-5 Central Daylight Time EST GMT-5 Eastern Standard Time EDT GMT-4 Eastern Daylight Time HST GMT-10 Alaska-Hawaii Standard Time HDT GMT-9 Alaska-Hawaii Daylight Time MST GMT-7 Mountain Standard Time MDT GMT-6 Mountain Daylight Time NST GMT-3.5 Newfoundland Standard Time PST GMT-8 Pacific Standard Time PDT GMT-7 Pacific Daylight Time YST GMT-9 Yukon Standard Time YDT GMT-8 Yukon 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|
Общие правила
-
Интервал времени между GMT и локальным временем вычисляется заново через каждые 30 секунд.
-
Если в момент выполнения функции происходит перевод времени (например, времени местного московского 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, преобразованное из даты по Гринвичу в локальную дату (время) заданного часового пояса в летний или зимний период времени.
Примеры
-
Получить разницу в часовых поясах между местным временем и временем по Гринвичу:
select datesplit(to_localtime(sysdate),'hh') - datesplit(sysdate,'hh'); | 3|
-
select to_localtime(to_date('31.12.2125','DD.MM.YYYY'),'GMT-1'); |30.12.2125:23:00:00.00|
-
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|
-
Переход на зимнее время:
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');