Хранит ли SQL Server функцию DateTime Offset Agnostic? - PullRequest
0 голосов
/ 06 ноября 2018

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

В SQL Server (> = 2012), столбце таблицы типа datetime, хранится ли он независимо от смещения часового пояса или как он работает? Из моего исследования может показаться, что datetimeoffset это тип, который включает смещение с датой / временем, в то время как datetime просто пропускает это?

Когда я читаю данные из базы данных и использую CONVERT( datetimeoffset, [My Column] ), это дает мне 2016-09-21 16:49:54.7170000 +00:00, когда я и сервер оба в UTC +02: 00, что подтверждает мою веру, я прав?

Я пытаюсь добиться того, чтобы данные были сохранены ОТ различных смещений tz (через функцию), затем сохранены в базе данных в формате UTC и, наконец, преобразовали значение datetime обратно в (возможно, другое) смещение , Меня не волнует DST / и т. Д., Поскольку браузер пользователя выдаст мне текущее смещение во время сохранения, а пользователь, выполняющий просмотр, выдаст мне смещение tz во время просмотра. Для исторических отчетов точное время суток (зависит от летнего времени) не имеет значения.

В настоящее время в таблицах базы данных уже используется datetime вместо datetimeoffset; по моим наблюдениям, вполне нормально продолжать с этим, хотя в какой-то момент было бы неплохо перейти на datetimeoffset, чтобы потом начать запись исторического смещения tz?

Любая ясность будет принята с благодарностью.

1 Ответ

0 голосов
/ 06 ноября 2018

TL; DR; Да. тип данных DateTimeDateTime2) не учитывает часовой пояс.

Длинная версия:

Официальная документация DateTime четко гласит, что тип данных DateTime не поддерживает часовой пояс (и летнее время). То же самое верно для DateTime2.

Вы можете видеть, что на обеих страницах есть таблица, описывающая свойства типа данных, и в этой таблице для обоих типов данных значение для "Осведомленность о смещении часового пояса и сохранение" и для "Летнего времени, осведомленное" является "Нет" ».

Time zone offset aware and preservation     No
Daylight saving aware                       No

Описание DateTime выглядит следующим образом:

Определяет дату, которая объединяется с временем суток с долями секунды, основанными на 24-часовых часах.

Описание DateTime2 выглядит следующим образом:

Определяет дату, которая объединяется с временем суток на основе 24-часовых часов.
datetime2 можно рассматривать как расширение существующего типа datetime, который имеет больший диапазон дат, большую дробную точность по умолчанию и необязательную пользовательскую точность.

Единственный тип данных, который учитывает часовой пояс: DateTimeOffset:

Определяет дату, которая объединяется с временем дня, которое имеет информацию о часовом поясе и основано на 24-часовых часах.

Кстати, рекомендуется выбрать DateTime2 вместо DateTime, обе согласно официальной документации Microsoft:

Примечание
Используйте типы данных time , date , datetime2 и datetimeoffset для новой работы. Эти типы соответствуют стандарту SQL. Они более портативны. time, datetime2 и datetimeoffset обеспечивают большую точность секунд. datetimeoffset обеспечивает поддержку часовых поясов для глобально развернутых приложений.

И профессионалы SQL Server: Почему вы никогда не должны снова использовать DATETIME! :

Datetime также имеет ошибку / функцию, неявно преобразующую строковые литералы формата yyyy-mm-dd / yyyy-mm-dd hh:mm:ss - Datetime будет пытаться преобразовать их с использованием локальных настроек, в то время как Datetime2 всегда будет преобразовывать их правильно. Прочтите этот ТАК пост об этом .

...