sql datediff的确切c#结果

时间:2011-09-30 15:07:06

标签: c# sql sql-server datetime datediff

我正在尝试获取sql中的天数(由by datediff计算)和c#中的天数(由DateTime.now.Substract计算)相同,但它们返回不同的结果....


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

VS


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

在这两种情况下,ExpirationDate都是'10 / 1/2011 00:00:00',代码和数据库位于同一台服务器上。我希望return int是相同的。我怀疑我错过了一些愚蠢的想法......想法?

3 个答案:

答案 0 :(得分:5)

dateDiff(dd,getDate(),ExpirationDate)正在做一天比较。 DateTime.Now.Subtract(expirationDate).Days正在进行日期和时间

例如

SELECT dateDiff(dd,'10/1/2011 23:59:00' , '10/2/2011')即使只相隔一分钟也会返回一天。

如果您想在C#中使用相同的内容,则需要删除时间组件

e.g。

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相同。

无论如何,Stealth Rabbi的答案似乎更优雅,因为你正在寻找TimeSpan而不是DateTime

答案 1 :(得分:4)

10/1/2011距离DateTime.Now不到1天。既然你回来了TimeSpan,然后将Days应用于它,你就会得到一个TimeSpan,它是< 1天。所以它将返回0天。

相反,只需使用那些DateTimes的Date组件,它就会正确地报告相隔天数 - 就像这样:

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

这将使你获益1天。

答案 2 :(得分:3)

我假设您想要天的数量,而不是前一个最大单位的天数。您想要使用TotalDays属性。此外,您可能会发现使用减号运算符更容易进行减法

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

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