在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;
}
问题是,有更好的方法吗?
答案 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;
}