2013-04-12 8 views
1

У нас возникла проблема, когда программа, создающая запрос выбора, находится в одном часовом поясе, база данных находится в другом, а сравнение дат включает дополнительный день. Я предполагаю, что это связано с тем, что я говорю @date < '2013-01-04', где @date задается как параметр в Великобритании, но для базы данных в США из-за разницы в часовом поясе часть timeoffset перемещает ее на следующий день.SQL-базы данных, тип даты и часовые пояса (ADO.NET)

DateTime в базе данных в основном является целым числом (или длинным). Итак, как это работает с ADO.NET, когда база данных имеет значение столбца Date в 2013-01-04T00: 00: 00 - это то, что хранится в виде UTC DateTime, локальное DateTime (независимо от того, где происходит смещение в этой точке) , или конкретное смещение?

И когда я задал этот параметр с помощью DateTime (Kind == Local), как это перевести?

thanks - dave

ответ

0

Зависит от базы данных. Но, конечно, неверно утверждать, что все базы данных по всему серверу хранятся как одно целое число (например, dot Net или javascript). Вы не указали в своем вопросе, какой продукт базы данных вы используете, но SQL Server, например, использует двух числа: внутреннее представление

в SQL Server для DateTime и smalldatetime значения является значением две части первой часть которой представляет собой целое число, представляющее число дней с 1 января 1900 года, а вторая часть представляет собой десятичную дробь, представляющую дробную часть за один день (на время) --- Таким образом, целочисленное значение 0 (ноль) всегда переводится непосредственно в Полуночное утро от 1 января 1900 года.

Вторая часть, временная часть внутренне также является целым числом, представляющим количество тактов с полуночи. См. this. Часы-отметки составляют 1/300 секунды, около 3,333 миллисекунды.

+1

Да, но ... Число дней и секунд с 1 января, где? Значение 0 в Англии является отрицательным числом в Колорадо. –

0

Если вы сохраняете .NET DateTime всегда будет иметь одинаковое значение в базе данных как .ToString()

Он не будет указать часовой пояс.

Я рекомендую вам использовать .ToUniversalTime() во все даты, прежде чем хранить их в своей базе данных и считать, что все они являются UTC при их чтении.

Смежные вопросы