Введение
Для работы с параметром времени на языке TSql у компании Microsoft в хранилище MSDN отведен целый раздел «Функции даты и времени» в котором можно подробно изучить все нюансы работы. Но когда дело касается примитивных на первый взгляд операций, ситуация становится не столь явно решаемой.
Для примера можно взять процедуру смены часового пояса для записи типа «datetime». Процедура сводится к смещение на определенный интервал времени исходного значения. К сожалению простого метода, который бы реализовал это в TSql нет (как впрочем и в других языках запросов, хотя не факт).
Теория
Для того чтобы решить проблему можно воспользоваться несколькими вариантами, в зависимости от воображения и глобального мышления. Рассмотрим их по порядку в порядка убывания их рейтинга в глобальных поисковых системах:
1) С использованием метода «DateDiff(datePart,GetUTCDate(),GetDate())» — данный метод вернет значение текущего часового пояса (в котором работает сервер) относительно значения UTC. Реализовать сам механизм преобразования можно за счет стандартной процедуры «DateAdd(datePart, @DateTimeOffset, @InDateTime)» где: @ DateTimeOffset представляет собой результат вычисления «DateDiff», а @InDateTime – ваше время, которое необходимо преобразовать, datePart везде принимает значение «mi» — минуты.
2) С использованием метода «DatePart(datePart,@DateTimeWithOffset)» — данный метод вернет значение смещения часового пояса, указанного в параметре @DateTimeWithOffset, а также со значением datePart со значением «tz» — таймзона. Далее можно воспользоваться процедурой «DateAdd(datePart, @ DateTimeOffset, @InDateTime)» — где значения входных параметров аналогичны тем что использованы в первом случае.
3) И наконец самый оригинальный метод с использование метода «SwitcOffset(@DateTimeOffset, @TimeZone)» — здесь параметр @DateTimeOffset является результатом преобразования типа «datetime» в тип «datetimeoffset» и применяется для получения времени со смещением часового пояса, а параметр @TimeZone – расчитывается по методу «DatePart» с параметрами «tz» и «SysDateTimeOffset()» соответственно. Такая сложная схема использована для того чтобы получить смещение часового входного параметра относительно текущего значения времени (времени сервера) или какого либо другого указанного значения времени. Необходимо также указать к какому типу данных должен относиться результат, поскольку по умолчанию он будет отображаться в виде типа строки.
Практика
Примеры на TSql (SQL Server 2008):
1) Select DateAdd(mi, DateDiff(mi, GetUTCDate(), GetDate()),‘2011-07-19 12:33:00’) as Result
2) Select DateAdd(mi, DatePart(tz, ‘2011-07-19 12:33:00 +04:00’),‘2011-07-19 12:33:00’) as Result
3) Select Cast((Select SwitcOffset(Cast(‘2011-07-19 12:33:00’ as DateTimeOffset), DatePart(tz, SysDateTimeOffset())) as A) as Datetime) as Result
Ссылки
1) MSDN — Функции даты и времени (Transact-SQL)
2) Using time zone data in SQL Server 2008
3) Sql Server DateTime to DateTimeOffset