Я решил проблему, скопировав два файла
EntityFramework.SqlServer.dll
EntityFramework.SqlServer.xml
в /bin
.
Стандартные операторы сравнения (например, равенство, меньше, больше) перегружены для типа DateTime
. Таким образом, вы можете просто выполнить следующие тесты:
var foo = DateTime.Parse("01/01/1900");
var bar = DateTime.Now;
var test1 = foo == bar; // false
var test2 = foo != bar; // true
var test3 = foo < bar; // true
var test4 = foo > bar; // false
Предполагая, что вы хотите проверить эквивалентность двух DateTimes, можно воспользоваться следующим способом:
TimeSpan span = dateTime2 - dateTime1;
if (span == TimeSpan.Zero)
{
// The times are the same
}
Вам нужно будет преобразовать System.Data.SqlTypes.SqlDateTime
в System.DateTime
, конечно, в первую очередь, как указывает echosca в своем ответе .
Хотя должна быть некоторая допустимая ошибка округления (скажем, в миллисекундном диапазоне), поскольку они, вероятно, будут значения, производные от реального мира, поскольку простого равенства было бы недостаточно. Вам понадобится что-то вроде этого:
if (Math.Abs(span.TotalMilliseconds) < 10.0)
{
// The times are within the allowed range
}
Если вы просто хотите сравнить, находится ли одна дата до или после другой, используйте метод DateTime.CompareTo
, как предлагали другие.
Вам нужно поместить значение из sql в объект DateTime C #, а затем сравнить их в C #. Вот ссылка из MSDN о том, как это сделать.
Вы можете использовать метод DateTime.CompareTo .
Использование выглядит следующим образом:
firstDateTime.CompareTo(secondDatetime);
и возвращает int в качестве результата, который указывает
меньше чем ноль - этот экземпляр предшествует значению.
Ноль - этот экземпляр совпадает с значением.
Больше нуля - этот экземпляр является более поздним, чем значение.
При извлечении из базы данных вы должны иметь возможность использовать SqlDataReader для приведения к правильному типу .NET. (или используйте DataTable / DataSet, который делает это автоматически).
SqlDataReader dr = cmd.ExecuteReader();
DateTime dt = dr.GetDateTime(dr.GetOrdinal("someDateTimeColumn"));
тогда вы можете сравнивать обычным образом:
DateTime otherDate = DateTime.Now;
int compResult = dt.CompareTo(otherDate);
if(compResult > 0) { Console.Write("dt is after otherDate"); }
else if(compResult < 0) { Console.Write("dt is before otherDate"); }
else { Console.Write("dt is equal to otherDate"); }
System.Data.SqlTypes.SqlDateTime и System.DateTime используют разные базовые структуры для представления дат.
SqlDateTime представляет диапазон с 1 января 1753 г. по 31 декабря 9999 г. с точностью до 3,33 миллисекунды.
DateTime (тип .NET Framework) представляет диапазон между 1 января , 0001 до 31 декабря 9999 с точностью до 100 наносекунд
. Вы должны быть осторожны с этими границами при сравнении дат. Одна из тактик для устранения проблем при сравнении может заключаться в приведении всего к System.DateTime, а затем к выполнению сравнения.
Вы можете использовать свойство Value структуры SqlDateTime (которая возвращает System.
Структура DateTime имеет приоритет над оператором GreterThen, GreaterThenOrEqual, LesserThen, LesserThenOrEqual, оператором Equalty.
DateTime dateTime1, dateTime2;
dateTime1 = DateTime.Now;
dateTime2 = //set value from database;
// all this operations are legal
if(dateTime1 == dateTime2){}
if(dateTime1 > dateTime2){}
if(dateTime1 < dateTime2){}
Надеюсь, вы найдете эту статью ( Демистифицированная функция DATEDIFF ) полезной, хотя она специфична для datetime в SQL, но полезна для понимания того, как она обрабатывается на стороне базы данных.
Будьте осторожны при сравнении 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
Обратите внимание, что это не проблема, если вы сравниваете два datetime, извлеченные из базы данных, или datetime, построенные из компонентов со второй или большей степенью детализации.
См. также: это сообщение в блоге
1 См. примечание о точности, где упоминается «Округление с шагом 0,000, 0,003 или 0,007 секунды "