Я делаю несколько запросов на выборку SQL и хочу преобразовать свой столбец даты и времени в формате UTC в местное время, чтобы оно отображалось как местное время в результатах моего запроса. Обратите внимание, я не собираюсь делать это преобразование с помощью кода, а скорее, когда я делаю ручные и случайные запросы SQL к моим базам данных.
sql
sql-server
Nugs
источник
источник
Ответы:
Вы можете сделать это следующим образом на SQL Server 2008 или более поздней версии:
Вы также можете сделать менее многословно:
Что бы вы ни делали, не используйте
-
для вычитания дат, потому что операция не является атомарной, и вы будете иногда получать неопределенные результаты из-за состязаний между системным временем и временем, проверяемым в разное время (т. Е. Неатомно) ,Обратите внимание, что этот ответ не принимает во внимание DST. Если вы хотите включить корректировку DST, пожалуйста, посмотрите также следующий вопрос:
Как создать функции начала и окончания перехода на летнее время в SQL Server
источник
Я не нашел ни одного из этих примеров полезным для получения даты и времени, хранящихся как UTC, с датой и временем в указанном часовом поясе (НЕ часовом поясе сервера, поскольку базы данных SQL Azure работают как UTC). Вот как я справился с этим. Это не элегантно, но просто и дает правильный ответ без ведения других таблиц:
источник
AT TIME ZONE
синтаксиса, рассмотрит stackoverflow.com/a/44941536/112764 - вы можете цепи несколько переходов вместе просто конкатенации несколькихat time zone <blah>
сек.dateTimeField AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time'
просто цепочкаAT TIME ZONE
утверждений. (@NateJ упомянул об этом выше, я вижу сейчас)Если вы используете местное время, скажем,
Eastern Standard Time
и хотите преобразовать его в UTC, тогда в Azure SQL и SQL Server 2016 и более поздних версиях вы можете выполнить:Полный список названий часовых поясов можно найти с помощью:
И да, часовые пояса имеют плохое название - хотя это так
Eastern Standard Time
, летнее время учитывается.источник
Если вам нужно преобразование, отличное от местоположения вашего сервера, вот функция, которая позволяет вам передавать стандартное смещение и учетные записи для летнего времени США:
источник
Использование новых возможностей SQL Server 2016:
Но процедура clr работает в 5 раз быстрее: '- (
Обратите внимание, что смещение для одной временной зоны может изменяться на зимнее или летнее время. Например
полученные результаты:
Вы не можете просто добавить постоянное смещение.
источник
Если включение CLR в вашей базе данных является опцией, а также использование часового пояса сервера SQL, его можно легко написать в .Net.
Вводится значение даты и времени в формате UTC, и выводится локальное значение даты и времени относительно сервера. Нулевые значения возвращают ноль.
источник
Не существует простого способа сделать это правильным и общим способом.
Прежде всего следует понимать, что смещение зависит от рассматриваемой даты, часового пояса и летнего времени.
GetDate()-GetUTCDate
только дает вам смещение сегодня в TZ сервера, что не имеет значения.Я видел только два рабочих решения, и я много искал.
1) Пользовательская функция SQL с парой таблиц базовых данных, таких как часовые пояса и правила летнего времени на TZ. Работает, но не очень элегантно. Я не могу опубликовать его, так как у меня нет кода.
РЕДАКТИРОВАТЬ: Вот пример этого метода https://gist.github.com/drumsta/16b79cee6bc195cd89c8
2) Добавьте сборку .net к БД, .Net может сделать это очень легко. Это работает очень хорошо, но недостатком является то, что вам нужно настроить несколько параметров на уровне сервера, и конфигурация легко нарушается, например, если вы восстанавливаете базу данных. Я использую этот метод, но не могу опубликовать его, так как у меня нет кода.
источник
Ни один из них не работал для меня, но это ниже работало на 100%. Надеюсь, что это может помочь другим, пытающимся преобразовать это, как я.
источник
declare @StandardOffset int = datediff (hh, GETUTCDATE(), GETDATE())
Вот версия, которая учитывает переход на летнее время, смещение UTC и не привязана к определенному году.
источник
Я обнаружил, что одноразовый способ слишком медленный, когда данных много. Поэтому я сделал это, присоединившись к табличной функции, которая позволила бы рассчитать разницу в часах. В основном это сегменты даты и времени со смещением часа. Год будет 4 ряда. Так что табличная функция
вернул бы эту таблицу:
Это учитывает летнее время. Пример его использования приведен ниже, а полный пост в блоге здесь .
источник
источник
Ответ Рона содержит ошибку. Используется 2:00 по местному времени, когда требуется эквивалент UTC. У меня недостаточно очков репутации, чтобы прокомментировать ответ Рона, поэтому исправленная версия появится ниже:
источник
Отметка времени UNIX - это просто количество секунд между определенной датой и эпохой Unix,
SELECT DATEDIFF (SECOND, {d '1970-01-01'}, GETDATE ()) // Это вернет метку времени UNIX на сервере SQL
Вы можете создать функцию для локального преобразования даты и времени в UIX UTC, используя функцию смещения по стране в метку времени Unix на сервере SQL.
источник
Это просто. Попробуйте это для Azure SQL Server:
Для локального сервера SQL:
источник
Для пользователей Azure SQL и
@@Version
> = SQL Server 2016 ниже приведено описание простой функцииAT TIME ZONE
.Для типов значений, которые
@LocalTimeZone
могут принять, пожалуйста, перейдите по этой ссылке или Перейти кKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
источник
В качестве предупреждения - если вы собираетесь использовать следующее (обратите внимание на миллисекунды вместо минут):
Имейте в виду, что часть DATEDIFF не всегда возвращает один и тот же номер. Так что не используйте его для сравнения DateTimes до миллисекунд.
источник
Я обнаружил, что эта функция быстрее, чем другие решения, использующие отдельную таблицу или циклы. Это просто базовое утверждение. Учитывая, что все месяцы между апрелем и октябрем имеют смещение на -4 часа (восточное время), нам просто нужно добавить еще несколько строк случаев для крайних дней. В противном случае смещение составляет -5 часов.
Это характерно для преобразования из UTC в восточное время, но при необходимости могут быть добавлены дополнительные функции часового пояса.
источник
Это должно быть в состоянии получить время сервера с DST
sysdatetimeoffset учитывает DST
источник
Первая функция: настроена для итальянского часового пояса (+1, +2), переключение дат: последнее воскресенье марта и октябрь, возвращает разницу между текущим часовым поясом и датой и временем в качестве параметра.
Код является:
Тогда функция, которая конвертирует дату
источник
- получить стандартное индийское время от UTC
источник
Это можно сделать без функции. Приведенный ниже код преобразует время UTC в горное время с учетом перехода на летнее время. Отрегулируйте все числа -6 и -7 в соответствии с вашим часовым поясом (т.е. для EST вы должны настроить соответственно на -4 и -5)
источник
Вы должны переформатировать строку, а также преобразовать в правильное время. В этом случае мне нужно было время Зулу.
источник
Лучший способ для Oracle:
С жестко закодированной датой:
Result:
2018-10-28 00:00
С именами столбцов и таблиц:
источник
У меня есть код для выполнения UTC в локальное и локальное время в UTC, что позволяет преобразование с использованием кода, подобного этому
и
Функции могут поддерживать все или подмножество часовых поясов в IANA / TZDB, как это предусмотрено NodaTime - см. Полный список на https://nodatime.org/TimeZones.
Помните, что мой вариант использования означает, что мне нужно только «текущее» окно, позволяющее преобразовать время в диапазоне примерно +/- 5 лет. Это означает, что метод, который я использовал, вероятно, не подходит вам, если вам нужен очень широкий период времени, из-за способа, которым он генерирует код для каждого интервала часового пояса в данном диапазоне дат.
Проект находится на GitHub: https://github.com/elliveny/SQLServerTimeConversion
Это генерирует код функции SQL согласно этому примеру
источник
Ну, если вы храните данные в виде даты UTC в базе данных, вы можете сделать что-то простое, как
это было всегда локально с точки зрения сервера, и вы не возитесь с AT
TIME ZONE 'your time zone name'
, если ваша база данных будет перемещена в другой часовой пояс, например, при установке клиента, жесткий кодированный часовой пояс может вас укусить.источник
В postgres это работает очень хорошо .. Скажите серверу время, в которое сэкономлено время, 'utc', а затем попросите его преобразовать в определенный часовой пояс, в данном случае 'Brazil / East'
Получить полный список часовых поясов с помощью следующего выбора;
Подробности здесь.
https://popsql.com/learn-sql/postgresql/how-to-convert-utc-to-local-time-zone-in-postgresql
источник
Вот более простой, который принимает DST для учета
источник
SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, GETUTCDATE(), '20150101'), GETDATE())
. В настоящее время я нахожусь в CEST (UTC + 2), но DST не будет действовать в новогодний день, поэтому правильный ответ для меня будет 1 января 2015 года 01:00. Ваш ответ, как и принятый ответ, возвращается 1 января 2015 года 02:00.