сравнить два значения даты и времени из SQL Server с помощью c # - PullRequest
5 голосов
/ 20 июня 2009

Я хочу знать, как сравнить два значения даты и времени: один получен из базы данных sql, а второй - текущий с c #

Ответы [ 9 ]

15 голосов
/ 20 июня 2009

Остерегайтесь при сравнении 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 секунд»

7 голосов
/ 20 июня 2009

Стандартные операторы сравнения (например, равенство, меньше, больше, чем) перегружены для типа 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
6 голосов
/ 20 июня 2009

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

Использование выглядит так:

firstDateTime.CompareTo(secondDatetime);

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

Меньше нуля - этот экземпляр раньше, чем значение.

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

Больше нуля - этот экземпляр позже значения.

5 голосов
/ 20 июня 2009

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

1 голос
/ 20 июня 2009

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) для элегантного сравнения без явного приведения.

Вы можете найти эту статью информативной.

1 голос
/ 20 июня 2009

При получении из базы данных вы должны иметь возможность использовать 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 голос
/ 20 июня 2009

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

0 голосов
/ 20 июня 2009

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

0 голосов
/ 20 июня 2009

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){}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...