如何在C#中正确模拟TSQL的DateDiff

时间:2012-02-20 16:48:21

标签: c# tsql datetime

在C#中使用TimeSpan功能对TSQL DateDiff时,我似乎得到了不同的结果。似乎DateDiff给出了两个日期之间的天数,而不考虑时间戳,而在C#中它考虑了时间戳。因此,如果第一个时间戳是上午10点,第二个时间戳是第二天上午9点,则时间跨度为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 个答案:

答案 0 :(得分:3)

你可以缩短你的方法,如下所示:

private static int DateDiff(DateTime from, DateTime to)
{
    return (to.Date - from.Date).Days;            
}

答案 1 :(得分:0)

 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

我发现这种方法适合我。

答案 2 :(得分:0)

这样的事情:

private static int DateDiff(DateTime From, DateTime To)
{
    return From.Subtract(To).Days;            
}
相关问题