Определение смещения часового пояса в T-SQL

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

Мне нужна функция 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(), чтобы определить смещение, но результат зависит от того, выполняется ли запрос во время DST или нет. Я не знаю ни одной встроенной функции T-SQL для определения смещения или того, является ли текущее время летним временем или нет?

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
5
0
45 904
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

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

Смещение будет относиться к текущей дате, а не к произвольной дате в будущем. Кроме того, это будет относиться к часовому поясу сервера, а не клиента.

neonski 08.10.2008 02:31

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

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

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

FROM_TZ(YOUR_TIMESTAMP, 'UTC') AT TIME ZONE 'America/Dawson_Creek'
Ответ принят как подходящий

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

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

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

Спасибо, Эрик. Я реализовал решение на основе таблиц, как вы предлагали ранее. Мне просто было интересно, не упустил ли я что-нибудь, что облегчило бы мне жизнь.

Andy Frieders 10.10.2008 02:07

Другие вопросы по теме