#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 — это интерпретация реляционной алгебры!