сравните два значения даты и времени от SQL Server с c#

Я решил проблему, скопировав два файла

EntityFramework.SqlServer.dll
EntityFramework.SqlServer.xml

в /bin.

5
задан John Saunders 20 June 2009 в 15:43
поделиться

9 ответов

Стандартные операторы сравнения (например, равенство, меньше, больше) перегружены для типа 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
7
ответ дан 18 December 2019 в 05:24
поделиться

Предполагая, что вы хотите проверить эквивалентность двух 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 , как предлагали другие.

5
ответ дан 18 December 2019 в 05:24
поделиться

Вам нужно поместить значение из sql в объект DateTime C #, а затем сравнить их в C #. Вот ссылка из MSDN о том, как это сделать.

1
ответ дан 18 December 2019 в 05:24
поделиться

Вы можете использовать метод DateTime.CompareTo .

Использование выглядит следующим образом:

firstDateTime.CompareTo(secondDatetime);

и возвращает int в качестве результата, который указывает

меньше чем ноль - этот экземпляр предшествует значению.

Ноль - этот экземпляр совпадает с значением.

Больше нуля - этот экземпляр является более поздним, чем значение.

6
ответ дан 18 December 2019 в 05:24
поделиться

При извлечении из базы данных вы должны иметь возможность использовать 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"); }
1
ответ дан 18 December 2019 в 05:24
поделиться

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.

1
ответ дан 18 December 2019 в 05:24
поделиться

Структура 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){}
0
ответ дан 18 December 2019 в 05:24
поделиться

Надеюсь, вы найдете эту статью ( Демистифицированная функция DATEDIFF ) полезной, хотя она специфична для datetime в SQL, но полезна для понимания того, как она обрабатывается на стороне базы данных.

0
ответ дан 18 December 2019 в 05:24
поделиться

Будьте осторожны при сравнении 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 секунды "

16
ответ дан 18 December 2019 в 05:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: