Попробуйте это, (я еще не подтвердил)
INSERT INTO Delegates ([MemNo],[FromYr],[ToYr]) values(@MemNo, @FromYr,@ToYr)
where @MemNo not in
(
SELECT MemNo FROM words WHERE FromYr = @FromYr
)
Необходимо хранить данные в формате UTC и показе его в локальном формате часового пояса.
DateTime.ToUniversalTime() -> server;
DateTime.ToLocalTime() -> client
Можно скорректировать использование даты/времени группа методов AddXXX, но это может быть подвержено ошибкам..NET имеет поддержку часовых поясов в Системе. Класс TimeZoneInfo.
Вплоть до.NET 3.5 (VS 2008).NET не имеет никакой встроенной поддержки часовых поясов кроме преобразования в и от UTC.
Если разница во времени является всегда точно 3 часами весь год (лето и зима), просто используйте yourDate.AddHours(3)
изменить его один путь, и yourDate.AddHours(-3)
возвращать его. Обязательно факторизуйте это в функцию, объяснив причину adding/substracting эти 3 часа.
Вы могли использовать комбинацию TimeZoneInfo. GetSystemTimeZones () и затем используют TimeZoneInfo. Свойство BaseUtcOffset для возмещения времени в базе данных на основе различия в смещении
Информация о Системе. TimeZoneInfo здесь
Вы знаете, это - хороший вопрос. В этом году я сделал свое первое приложение DB и поскольку мои входные данные, связанные со временем, являются значением Int64, именно это я сохранил прочь в DB. Мои клиентские приложения получают его и делают DateTime. FromUTC () или FromFileTimeUTC () на том значении и делают.LocalTime () для показа вещей в их местное время. Я задался вопросом, было ли это хорошо/плохо/ужасно, но это работало достаточно хорошо на мои потребности к настоящему времени. Конечно, работа заканчивает тем, что была сделана библиотекой уровня доступа к данным, которую я записал а не в самом DB.
Кажется, работает достаточно хорошо, но я доверяю другим, у которых есть больше опыта с этим видом вещи, мог указать, где это не лучший подход.
Удачи!
Если вы используете .Net, вы можете использовать TimeZoneInfo
. Поскольку вы пометили вопрос с помощью 'c #', я предполагаю, что да.
Первым шагом является получение TimeZoneInfo
для часового пояса, в который нужно преобразовать. В вашем примере часовой пояс Нью-Йорка. Вот как это можно сделать:
//This will get EST time zone
TimeZoneInfo clientTimeZone
= TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
//This will get the local time zone, might be useful
// if your application is a fat client
TimeZoneInfo clientTimeZone = TimeZoneInfo.Local;
Затем, после того как вы прочитаете DateTime
из своей БД, вам нужно убедиться, что его Kind
правильно установлен. Предположим, что DateTime
в БД находятся в формате UTC (кстати, это обычно рекомендуется), вы можете подготовить его к преобразованию следующим образом:
DateTime aDateTime = dataBaseSource.ReadADateTime();
DateTime utcDateTime = DateTime.SpecifyKind(aDateTime, DateTimeKind.Utc);
Наконец, чтобы преобразовать в другое время зона, просто сделайте следующее:
DateTime clientTime = TimeZoneInfo.ConvertTime(utcDateTime, clientTimeZone);
Несколько дополнительных замечаний:
TimeZoneInfo
может храниться в статических полях, если вас интересуют только несколько конкретных часовых поясов; TimeZoneInfo
хранит информацию о переходе на летнее время. Так что вам не придется об этом беспокоиться; Надеюсь, это поможет. :)