В настоящее время я использую следующее, чтобы получить локальную дату / время из даты и времени UTC:
SET @offset = DateDiff(minute, GetUTCDate(), GetDate())
SET @localDateTime = DateAdd(minute, @offset, @utcDateTime)
Моя проблема в том, что если летнее время происходит между GetUTCDate()
и @utcDateTime
, в @localDateTime
конечном итоге это будет на час.
Есть ли простой способ конвертировать из utc в местное время для даты, которая не является текущей датой?
Я использую SQL Server 2005
WITH PERMISSION_SET = UNSAFE
. Некоторые среды не позволяют это, как AWS RDS. И это, ну, небезопасно. К сожалению, нет полной реализации часового пояса .Net, которую можно использовать безunsafe
разрешения. Смотрите здесь и здесь .Я разработал и опубликовал проект T-SQL Toolbox для codeplex, чтобы помочь всем, кто борется с обработкой даты и времени в Microsoft SQL Server. Это открытый исходный код и полностью бесплатное использование.
Он предлагает простые функции преобразования даты и времени с использованием простого T-SQL (без CLR) в дополнение к предварительно заполненным таблицам конфигурации из коробки. И он имеет полную поддержку DST (летнее время).
Список всех поддерживаемых часовых поясов можно найти в таблице «DateTimeUtil.Timezone» (предоставляется в базе данных T-SQL Toolbox).
В вашем примере вы можете использовать следующий пример:
Это вернет преобразованное локальное значение даты и времени.
К сожалению, он поддерживается для SQL Server 2008 или более поздней версии только из-за более новых типов данных (DATE, TIME, DATETIME2). Но так как предоставляется полный исходный код, вы можете легко настроить таблицы и пользовательские функции, заменив их на DATETIME. У меня нет MSSQL 2005, доступного для тестирования, но тогда он должен работать и с MSSQL 2005. В случае вопросов, просто дайте мне знать.
источник
Я всегда использую эту команду TSQL.
Это очень просто, и это делает работу.
источник
Я нашел этот ответ в StackOverflow, который предоставляет определенную пользователем функцию, которая, как представляется, для точного перевода даты и времени
Единственное, что вам нужно изменить - это
@offset
переменная вверху, чтобы установить для нее смещение часового пояса сервера SQL, на котором выполняется эта функция. В моем случае наш SQL-сервер использует EST, то есть GMT - 5Он не идеален и, вероятно, не будет работать во многих случаях, таких как смещения TZ на полчаса или 15 минут (для тех, кто рекомендовал бы функцию CLR, как рекомендовал Кевин ), однако он работает достаточно хорошо для большинства общих часовых поясов на севере Америка.
источник
Для SQL Server 2016+ вы можете использовать ЗОНУ ВРЕМЕНИ . Он будет автоматически обрабатывать время перехода на летнее время.
источник
Есть несколько хороших ответов на аналогичный вопрос, заданный на переполнение стека. Я решил использовать подход T-SQL из второго ответа Боба Олбрайта, чтобы устранить беспорядок, вызванный консультантом по преобразованию данных.
Он работал почти для всех наших данных, но потом я понял, что его алгоритм работает только для дат, начиная с 5 апреля 1987 года , и у нас были некоторые даты из 1940-х годов, которые все еще не конвертировались должным образом. В конечном итоге нам потребовались
UTC
даты в нашей базе данных SQL Server для согласования с алгоритмом в сторонней программе, которая использовала Java API для преобразованияUTC
в местное время.Мне нравится
CLR
пример, приведенный выше в ответе Кевина Физеля, на примере Харша Чавлы, и я также хотел бы сравнить его с решением, использующим Java, поскольку наш интерфейс использует Java дляUTC
преобразования в местное время.В Википедии упоминается 8 различных конституционных поправок, которые предусматривают корректировку часового пояса до 1987 года, и многие из них очень локализованы в разных штатах, поэтому есть вероятность, что CLR и Java могут интерпретировать их по-разному. Использует ли ваш код интерфейсного приложения dotnet или Java, или даты до 1987 года представляют для вас проблему?
источник
Вы можете легко сделать это с помощью хранимой процедуры CLR.
Вы можете хранить доступные часовые пояса в таблице:
И эта хранимая процедура заполнит таблицу с возможными часовыми поясами на вашем сервере.
источник
WITH PERMISSION_SET = UNSAFE
. Некоторые среды не позволяют это, как AWS RDS. И это, ну, небезопасно. К сожалению, нет полной реализации часового пояса .Net, которую можно использовать безunsafe
разрешения. Смотрите здесь и здесь .SQL Server версии 2016 решит эту проблему раз и навсегда . Для более ранних версий решение CLR, вероятно, является самым простым. Или для конкретного правила DST (например, только для США) функция T-SQL может быть относительно простой.
Тем не менее, я думаю, что общее решение T-SQL может быть возможным. Пока
xp_regread
работает, попробуйте это:(Сложная) функция T-SQL может использовать эти данные для определения точного смещения для всех дат в текущем правиле DST.
источник
источник
Вот ответ, написанный для конкретного британского приложения и основанный исключительно на SELECT.
Не применяется с полуночи до 1 часа ночи в летнее время. Это можно исправить, но приложение, для которого оно было написано, не требует этого.
источник