Точный c # результат sql datediff - PullRequest
       7

Точный c # результат sql datediff

3 голосов
/ 30 сентября 2011

Я пытаюсь получить число дней (рассчитанное byu datediff) в sql и количество дней в c # (рассчитанное DateTime.now.Substract) одинаковыми, но они возвращают разные результаты ....


//returns 0
int reso = DateTime.Now.Subtract(expirationDate).Days;

против


//returns 1
dateDiff(dd,getDate(),ExpirationDate)

В обоих случаях ExpirationDate равен «10/1/2011 00:00:00», а код и БД находятся на одном сервере,Я хочу, чтобы возвращение int было таким же.Я подозреваю, что упускаю что-то глупое ... идеи ??

Ответы [ 3 ]

5 голосов
/ 30 сентября 2011

dateDiff(dd,getDate(),ExpirationDate) Проводит сравнение дней. DateTime.Now.Subtract(expirationDate).Days делает дату и время

Например

SELECT dateDiff(dd,'10/1/2011 23:59:00' , '10/2/2011') возвращает один день, даже если с интервалом всего одна минута.

Если вы хотите то же самое в C #, вам нужно удалить компонент времени

, например

DateTime  dt1 = new DateTime(2011,10,1, 23,59,0);
DateTime  dt2 = new DateTime(2011,10,2, 0,0,0);

Console.WriteLine((int) dt2.Subtract(dt1.Subtract(dt1.TimeOfDay)));

Так что в вашем случае это будет что-то вроде

DateTime CurrentDate = DateTime.Now;
int reso = CurrentDate.Subtract(CurrentDate.TimeOfDay).Subtract(DateTime.expirationDate).Days;

Я не проверял это, но я не сделал бы DateTime.Now.Subtract(DateTime.Now.Subtract.TimeOfDay)

Поскольку второй вызов Now не будет таким же, как первый вызов Now 1023 *

В любом случае ответ Стелс Рабби кажется более элегантным, поскольку вы ищете TimeSpan, а не DateTime

4 голосов
/ 30 сентября 2011

10/1/2011 меньше, чем 1 день от DateTime.Now. Так как вы возвращаете TimeSpan, а затем применяете к нему Days, вы получаете TimeSpan, который составляет <1 день. Так что вернется 0 дней. </p>

Вместо этого, просто используйте компонент Date этих DateTimes, и он будет правильно сообщать о количестве дней, например:

DateTime now = DateTime.Now;
DateTime tomorrow = new DateTime(2011, 10, 1);
var val = (tomorrow.Date - now.Date).Days;

Это даст вам 1 день.

3 голосов
/ 30 сентября 2011

Я предполагаю, что вы хотите количество Всего дней, а не количество дней от наибольшего предыдущего блока.Вы хотели бы использовать свойство TotalDays.Кроме того, вам может оказаться проще использовать оператор минус для вычитания

DateTime d1 = DateTime.Now;
DateTime d2 = new DateTime(2009, 1, 2);

TimeSpan difference = d1 - d2;
Console.WriteLine(difference.TotalDays); // Outputs (today):1001.46817997424 
...