Преобразование времени по Гринвичу к локальному времени
Функция
Преобразование времени по Гринвичу к локальному времени.
Спецификация
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
Синтаксические правила
-
<Дата-время выражение>
– значение, воспринимаемое как дата (время) нулевого часового пояса (по Гринвичу). -
Если аргумент
<часовой пояс>
равен 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');