Как работать с хранилищем времени в 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(), чтобы преобразовать его обратно.