Остерегайтесь при сравнении DateTimes, сгенерированных в C #. Структура DateTime в C # обладает большей точностью, чем тип datetime 1 в SQL Server. Поэтому, если вы сгенерируете DateTime в C # (скажем, из DateTime.Now
), сохраните его в базе данных и получите его обратно, он, скорее всего, будет другим.
Например, следующий код:
using(SqlConnection conn = new SqlConnection("Data Source=.;Integrated Security=SSPI"))
using(SqlCommand cmd = new SqlCommand("SELECT @d", conn)){
DateTime now = DateTime.Now;
cmd.Parameters.Add(new SqlParameter("@d", now));
conn.Open();
DateTime then = (DateTime)cmd.ExecuteScalar();
Console.WriteLine(now.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
Console.WriteLine(then.ToString("yyyy/MM/dd HH:mm:ss.fffffff"));
Console.WriteLine(then - now);
}
возвращает следующий пример результата.
2009.06.20 12:28:23.6115968
2009.06.20 12:28:23.6100000
-00:00:00.0015968
Итак, в этой ситуации вы хотели бы проверить, что разница находится в пределах определенного эпсилона:
Math.Abs((now - then).TotalMilliseconds) < 3
Обратите внимание, что это не проблема, если вы сравниваете две даты и времени, извлеченные из базы данных, или дату и время, построенные из компонентов со вторым или большим уровнем детализации.
Смотрите также: это сообщение в блоге
1 См. Примечание о точности, где упоминается «Округлено с шагом .000, .003 или .007 секунд»