Как правильно эмулировать DateDiff TSQL в C # - PullRequest
2 голосов
/ 20 февраля 2012

Кажется, я получаю разные результаты при использовании функциональности TimeSpan в C # против TSQL DateDiff.Кажется, что DateDiff дает количество дней между двумя датами независимо от отметки времени, тогда как в C # он принимает во внимание отметку времени.Таким образом, если первая отметка времени находится в 10:00, а вторая отметка - в 9:00 следующего дня, временной интервал равен 0 дням, а DateDiff вернет 1.

declare @d1 datetime
declare @d2 datetime

set @d1 = '2/9/2011 10:00'
set @d2 = '2/10/2011 09:00'

select datediff(day, @d1, @d2)
-- prints 1

Используя C # DateTime и DateTime span.

  // will return 1 with same dates
  private static int DateDiff(DateTime from, DateTime to)
  {
        return (new DateTime(from.Year, from.Month, from.Day)
                - new DateTime(to.Year, to.Month, to.Day)).Days;            
  }

Вопрос в том, есть ли лучший способ сделать это?

Ответы [ 3 ]

3 голосов
/ 20 февраля 2012

Вы можете сделать свой метод короче, например так:

private static int DateDiff(DateTime from, DateTime to)
{
    return (to.Date - from.Date).Days;            
}
0 голосов
/ 20 февраля 2012

Примерно так:

private static int DateDiff(DateTime From, DateTime To)
{
    return From.Subtract(To).Days;            
}
0 голосов
/ 20 февраля 2012
 public enum DateInterval
    {
        Second, Minute, Hour, Day, Week, Month, Quarter, Year
    }

  public long DateDiff(DateInterval Interval, System.DateTime StartDate, System.DateTime EndDate)
    {
        long lngDateDiffValue = 0;
        System.TimeSpan TS = new System.TimeSpan(EndDate.Ticks - StartDate.Ticks);
        switch (Interval)
        {
            case DateInterval.Day:
                lngDateDiffValue = (long)TS.Days;
                break;
            case DateInterval.Hour:
                lngDateDiffValue = (long)TS.TotalHours;
                break;
            case DateInterval.Minute:
                lngDateDiffValue = (long)TS.TotalMinutes;
                break;
            case DateInterval.Month:
                lngDateDiffValue = (long)(TS.Days / 30);
                break;
            case DateInterval.Quarter:
                lngDateDiffValue = (long)((TS.Days / 30) / 3);
                break;
            case DateInterval.Second:
                lngDateDiffValue = (long)TS.TotalSeconds;
                break;
            case DateInterval.Week:
                lngDateDiffValue = (long)(TS.Days / 7);
                break;
            case DateInterval.Year:
                lngDateDiffValue = (long)(TS.Days / 365);
                break;
        }
        return (lngDateDiffValue);
    }//end of DateDiff

Я обнаружил, что этот метод работает для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...