Работа с часовыми поясами в SQL - PullRequest
2 голосов
/ 12 декабря 2011

Мне нужно получить SQL-запрос для вывода даты из поля datetime в формате Mmm dd yyyy hh:mm AM/PM. Лучший подход, который я смог придумать, это:

SELECT Left(
           Convert(
               nvarchar(30),
               SWITCHOFFSET(
                   CAST(datetime1 as datetimeoffset),
                   '-05:00'
               ),
               0
           ),
           LEN(
               Convert(
                   nvarchar(30),
                   SWITCHOFFSET(
                       CAST(datetime1 as datetimeoffset),
                       '-05:00'
                   )
               )
           )-11
       )

Однако, а) это ужасно! Я чувствую, что это должно быть проще, чем это; и б) я думаю, мне придется изменить мой запрос, когда вернется летнее время.

Исходные данные - это календарь sharepoint, поэтому я не могу просто изменить тип данных на datetimeoffset.

Есть идеи?

Спасибо, Стив

Ответы [ 2 ]

3 голосов
/ 12 декабря 2011

Как правило, вы не должны использовать SQL для форматирования данных во что-то презентабельное для внешнего интерфейса.Вы должны получить тип DateTime и использовать код в формате для его изменения.Что, если в будущем появится требование поддержки ДД / ММ / ГГГ?Вам понадобится отдельный запрос.Для этого лучше позволить внешнему форматировать его.

Имея это в виду, сохраните 2 части данных в базе данных.1) DateTime в качестве значения UTC. 2) Часовой пояс текущего пользователя (без смещения)

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

Затем, когда у вас есть эти две частиданных вы извлекаете дату и часовой пояс и создаете новый объект на сервере, который позволяет преобразовывать время в БД в местное время.

0 голосов
/ 13 декабря 2011

Я что-то упустил, или это просто:

Convert(nvarchar(30), DATEADD(Hour, -5, datetime1), 100)

Это должно добавить -5 часов к datetime1, а затем преобразовать его в формат, который вы указали.

Я согласен, что вы должны стараться по возможности использовать часовые пояса, а не смещения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...