Эффективное преобразование дат между временем UTC и местным (т. Е. PST) временем в SQL 2005 - PullRequest
29 голосов
/ 24 августа 2008

Как лучше всего преобразовать дату и время в формате UTC в местное время? Это не так просто, как разница между getutcdate () и getdate (), потому что разница меняется в зависимости от даты.

Интеграция с CLR для меня тоже не подходит.

Решение, которое я придумал для этой проблемы несколько месяцев назад, заключалось в том, чтобы иметь таблицу летнего времени, в которой были сохранены данные о начале и конце летнего времени в течение следующих примерно 100 лет. быстрый (простой поиск по таблице)

Ответы [ 12 ]

0 голосов
/ 03 апреля 2014

Мне нравится ответ @ Eric Z Beard .

Однако, чтобы избежать выполнения соединения каждый раз, как насчет этого?

TimeZoneOffsets
---------------
TimeZoneId    19
Begin         1/4/2008 2:00 AM
End           1/9/2008 2:00 AM
Offset        -5
TimeZoneId    19
Begin         1/9/2008 2:00 AM
End           1/4/2009 2:00 AM
Offset        -6
TimeZoneId    20 --Hong Kong for example - no DST
Begin         1/1/1900
End           31/12/9999
Offset        +8

Тогда

 Declare @offset INT = (Select IsNull(tz.Offset,0) from YourTable ds
 join   TimeZoneOffsets tz on tz.TimeZoneId=ds.LocalTimeZoneId  
 and x.TheDateToConvert >= ds.Begin and x.TheDateToConvert < ds.End)

наконец становится

 dateadd(hh, @offset, TheDateToConvert)
0 голосов
/ 24 августа 2008

Ведение таблицы TimeZone или оболочки с расширенным хранимым процессом (xp_cmdshell или COM-компонентом, или вашим собственным) и попросите ОС сделать это. Если вы пойдете по маршруту xp, вы, вероятно, захотите кэшировать смещение на день.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...