Определить смещение часового пояса в T-SQL - PullRequest
5 голосов
/ 08 октября 2008

Приложение моей базы данных будет развернуто на нескольких сайтах в разных часовых поясах.

Мне нужна функция T-SQL, которая будет определять временную метку UTC полуночи 1 января текущего года для расчетов с начала года. Все данные хранятся в метках времени UTC.

Например, Чикаго - это UTC-6 с летним временем (DST), функция должна возвращать '2008-01-01 06:00:00', если она будет запущена в любое время в Чикаго в 2008 году. Если запуск в Нью-Йорке (GMT-5 + DST) в следующем году, он должен вернуть '2009-01-01 05:00:00'.

Я могу получить текущий год от YEAR(GETDATE()). Я думал, что мог бы сделать DATEDIFF между GETDATE() и GETUTCDATE(), чтобы определить смещение, но результат зависит от того, выполняется ли запрос во время летнего времени или нет. Я не знаю каких-либо встроенных функций T-SQL для определения смещения или является ли текущее время летним или нет?

У кого-нибудь есть решение этой проблемы в T-SQL? Я мог бы жестко закодировать его или сохранить в таблице, но предпочел бы не делать этого. Я полагаю, что это идеальная ситуация для использования интеграции CLR в SQL Server 2005. Мне просто интересно, есть ли решение T-SQL, о котором я не знаю?

Ответы [ 3 ]

2 голосов
/ 08 октября 2008

Проверьте этот предыдущий вопрос и ответ для связанной информации:

Эффективное преобразование дат между временем UTC и местным (т. Е. PST) временем в SQL 2005

(Подводя итог, вам нужно построить таблицы часовых поясов и DST в Sql Server 2005. В следующей версии Sql Server мы получим некоторую помощь по часовым поясам.)

0 голосов
/ 08 октября 2008

Если я не ошибаюсь, функция GETUTCDATE () использует часовой пояс, определенный на сервере - она ​​не имеет информации о часовом поясе клиента (или любом часовом поясе). Я не думаю, что информация хранится где-либо в SQL Server 2005, что делает невозможным ее вычисление.

Может быть, вы могли бы «позаимствовать» данные из файла часового пояса Oracle и создать собственную функцию SQL Server?

Не по теме (может быть полезно кому-то еще), но если вы используете Oracle, вы можете использовать функцию FROM_TZ и 'AT TIME ZONE':

FROM_TZ(YOUR_TIMESTAMP, 'UTC') AT TIME ZONE 'America/Dawson_Creek'
0 голосов
/ 08 октября 2008

Хм, наверное, я не понимаю проблемы. Если приложение базы данных уже хранит временные метки UTC для всех своих транзакций, и вы хотите суммировать некоторые значения, начиная с первого года «местного времени», ваше условие должно быть примерно таким:

(timestamp + (getutcdate() - getdate())) > cast('01/01/2008' as datetime)

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

...