Вопрос по c# – сравнить два значения даты и времени из SQL Server с помощью c #

5

я хочу знать, как сравнить два значения datetime, один из которых получен из базы данных SQL, а другой является текущим с C #

Ваш Ответ

9   ответов
0

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){}
15

DateTime Структура в C # имеет большую точность, чемДата и время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, построенную из компонентов со второй или большей гранулярностью.

Смотрите также:этот блог

1See note about accuracy, where it mentions "Rounded to increments of .000, .003, or .007 seconds"

1

е базовые структуры для представления дат.

SqlDateTime представляет диапазон с 1 января 1753 по 31 декабря 9999 с точностью до 3,33 миллисекунды

DateTime (тип .NET Framework) представляет диапазон от 1 января 0001 по 31 декабря 9999 с точностью до 100 наносекунд

Вы должны быть осторожны с этими границами при сравнении дат. Одной из тактик устранения проблем при сравнении может быть преобразование всего в System.DateTime, а затем выполнение сравнения.

Вы можете использовать свойство Value структуры SqlDateTime (которая возвращает System.DateTime), чтобы выполнить сравнение элегантно и без явного приведения.

Вы можете найтиЭта статья познавательный.

6

DateTime.CompareTo метод.

Использование это так:

firstDateTime.CompareTo(secondDatetime);

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

Less than zero - This instance is earlier than value.

Zero - This instance is the same as value.

Greater than zero - This instance is later than value.

@ Сама Нет проблем! Как только вы найдете ответ, который вы считаете приемлемым, обязательно отметьте его как принятый ответ.
пожалуйста, напишите заявление
В нижней части этой страницы вы найдете конкретный пример в C #:msdn.microsoft.com/en-us/library/5ata5aya.aspx
спасибо вам большое
1

а затем сравнить их в C #. Вотссылка на сайт из MSDN о том, как это сделать.

5

что вы хотите проверить, что два DateTimes эквивалентны, вот так:

TimeSpan span = dateTime2 - dateTime1;
if (span == TimeSpan.Zero)
{
    // The times are the same
}

Вам нужно будет преобразоватьSystem.Data.SqlTypes.SqlDateTime вSystem.DateTime во-первых, как Эхоска указывает в своемответ.

Хотя должна быть некоторая допустимая ошибка округления (скажем, в миллисекундном диапазоне), поскольку они, вероятно, будут производными значениями реального мира, так как простое равенство не будет достаточно хорошим. Вам нужно что-то вроде этого:

if (Math.Abs(span.TotalMilliseconds) < 10.0)
{
    // The times are within the allowed range
}

Если вы просто хотите сравнить, является ли одна дата до или после другой, используйтеDateTime.CompareTo метод, как другие предложили.

Bugger - это то, что приходит от слишком быстрой печати! Я обновлю ответ
@Noldorin - ОП не уточнил, почему ему нужно было сравнить дату и время, поэтому я предположил, что было требование проверить, совпадают ли они.
span.TotalDays == 0 && span.TotalHours == 0 && span.TotalMinutes == 0 бит полностью избыточен, поскольку TotalSeconds будет неявно включать минуты, часы и т. д., преобразованные в секунды.
Вот почему я проголосовал за тебя. Тем не менее, сравнение дат, чтобы увидеть, что является более новым, может показаться более типичной операцией.
@ChrisF: Да, достаточно легко сделать ошибку. В любом случае, хорошо, что вы указали, что проблемы с плавающей запятой возникают при тестировании на использование DateTimes. (Однако чаще всего вам просто нужно использовать & lt; и & gt ;.)
7

равенство, меньше, больше, чем) перегружены для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
+1. Я не понимаю, почему некоторые ответы излишне усложняют ситуацию.
Приветствия. И да, это, безусловно, самый простой способ пойти по моему мнению. (Дает такое же поведение, как CompareTo, но более читабельно.)
1

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"); }
0

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

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