Как бороться с хранением времени в SQL - PullRequest
13 голосов
/ 21 октября 2008

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

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

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

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

Ответы [ 3 ]

17 голосов
/ 21 октября 2008

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

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

C # 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
7 голосов
/ 21 октября 2008

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

4 голосов
/ 21 октября 2008

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

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