Как получить смещение часового пояса из имени часового пояса

#sql-server #sql-server-2008 #sql-server-2005 #timezone #timezone-offset

#sql-server #sql-server-2008 #sql-server-2005 #Часовой пояс #смещение часового пояса

Вопрос:

У меня есть имя часового пояса, например America/Vancouver , сохраненное в базе данных SQL Server. Я хочу получить смещение UTC от имени часового пояса в SQL, например America/Vancouver , имеет -08:00 смещение. Итак, как я могу написать запрос на SQL? Ваша помощь очень ценится

Комментарии:

1. Смещение UTC в какой момент времени? Америка / Ванкувер варьируется между UTC-7 и UTC-8. Это относительно простой случай, поскольку, насколько я вижу, у него всегда было одно и то же стандартное время… но как насчет часовых поясов, которые переходят на «постоянное летнее время», например? (Это то, что многие страны Европейского союза могут сделать в ближайшие несколько лет… таким образом, Европа / Париж в настоящее время варьируется между UTC 1 и UTC 2, но в будущем может быть постоянно UTC 2.)

2. @JonSkeet Мне потребовалось смещение перехода на летнее время, как вы упомянули, в принципе, у меня есть время доступности пользователей с 12:00 до 04:00 в таблице SQL, а часовой пояс пользователя America/Vancouver включен, поэтому я должен сверить рабочее время UTC со временем доступности работника, поэтому мне нужно преобразовать UTCвремя для рабочего часового пояса и сравнить временной интервал

3. Когда вы говорите «рабочее время UTC» — у вас это уже есть как конкретное значение? Итак, вопрос действительно в том, «Как мне преобразовать определенный момент времени в часовой пояс, используя идентификатор часового пояса IANA?» (Было бы неплохо отредактировать вопрос, чтобы прояснить это.) Я не знаю, поддерживает ли SQL Server какие -либо часовые пояса IANA напрямую — возможно, вам потребуется сначала преобразовать идентификатор часового пояса IANA в идентификатор часового пояса Windows, после чего вы можете использовать «В ЧАСОВОМ ПОЯСЕ».

4. Вы отметили SQL Server 2005 и 21008 — какие вы используете?

Ответ №1:

Используйте DATEPART с параметром TZ. Пример :

 SELECT DATEPART(tz, (CAST('2021-01-01' AS DATETIMEOFFSET) AT TIME ZONE 'Central European Standard Time')); 
 

Результат в минутах.

Ответ №2:

К сожалению, SQL Server пока не поддерживает идентификаторы часовых поясов IANA (например America/Vancouver ) напрямую. На данный момент лучшим вариантом является преобразование идентификатора IANA в соответствующий идентификатор часового пояса Windows на уровне приложений и сохранение его на вашем SQL Server.

Например, если вы работаете.NET на вашем прикладном уровне вы можете использовать мой проект TimeZoneConverter:

 string tz = TZConvert.IanaToWindows("America/Vancouver");
// Result:  "Pacific Standard Time"
 

Затем вы можете использовать AT TIME ZONE функцию в коде вашего SQL Server:

 SELECT sysdatetimeoffset() AT TIME ZONE 'Pacific Standard Time'
 

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

Имейте в виду, что корректировка смещения будет отличаться в зависимости от того, действует переход на летнее время или нет. Несмотря на слово «Стандартный» в идентификаторе Windows, летнее время действительно учитывается там, где это применимо.

В качестве альтернативы, если по какой-либо причине вы должны сделать это полностью в SQL Server без преобразования в часовые пояса Windows, тогда вам нужно будет полагаться на такие проекты, как мой проект SqlServerTimeZoneSupport. Этот немного устарел и не очень хорошо поддерживается, поэтому я рекомендую отказаться от такого подхода, если вы можете ему помочь.

Комментарии:

1. Просто небольшая точность… AT ЧАСОВОЙ ПОЯС — это не функция, а оператор (в математической терминиологии …), как МЕЖДУ, КАК или В … а SQL — это интерпретация реляционной алгебры!