Как работать с хранилищем времени в SQL

У меня есть веб-приложение, которое я пишу (С#, MSSQL), и мне нужно сохранить временную метку, когда запись хранится в системе. Обычно я просто делаю это с помощью SQL и DATETIME. Однако сервер находится в другом часовом поясе, чем наша компания... И мы можем перейти на другой сервер в совершенно другой часовой пояс. Хостинговая компания не изменит время сервера, чтобы соответствовать нашему местному часовому поясу. (Не то, чтобы я их винил, но это была одна вещь, которую я пробовал.)

Итак, мой вопрос в том, как наилучшим образом сохранить дату и время обновления записи и как лучше всего представить эту дату/время пользователю в нашем локальном часовом поясе?

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

Можете ли вы показать мне пример кода? Спасибо!

Ответы

Ответ 1

всегда хранит данные DATETIME в режиме универсального времени (UTC aka GMT)

  • это позволяет избежать всех проблем с часовым поясом.
  • это позволяет избежать проблем, связанных с летней экономией.
  • это позволяет простой математике даты всегда работать
  • это позволяет транзакциям в разных часовых поясах оставаться в синхронизации.
  • Это позволяет перемещать данные на другой сервер в другом часовом поясе и не вибрировать все.
  • и т.д.. "Универсальное" время имеет смысл?

С# DateTime предоставляет DateTime.UtcNow и ToLocalTime(), SQL предоставляет GETUTCDATE(). Здесь функция SQL для преобразования UTC в локальное время -

-- convert UTC to local time
create FUNCTION [dbo].[udfUtcToLocalTime]
(
    @gmt datetime
)
RETURNS datetime
AS
BEGIN
    DECLARE @dt datetime
    SELECT 
        @dt = dateadd(millisecond,datediff(millisecond,getutcdate(), getdate()),@gmt)
    RETURN @dt
END

Пример:

SELECT dbo.udfUtcToLocalTime(someDateTimeField)
FROM someTable

Ответ 2

Сохраняйте время UTC в своей базе данных и локализуйте это время каждый раз, когда вы хотите показать их пользователю

Ответ 3

Сохраните его как время UTC, а затем заготовьте расчет часового пояса на стороне клиента в С# используйте .ToUniversalTime() в объекте DateTime, чтобы получить время UTC, сохраните его на сервере, а затем используйте .ToLocalTime(), чтобы преобразовать его обратно.