【问题标题】:Exact c# result of sql datediffsql datediff的确切c#结果
【发布时间】:2011-11-28 13:39:21
【问题描述】:

我试图让 sql 中的天数(由 datediff 计算)和 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 相同。我怀疑我错过了一些愚蠢的……想法??

【问题讨论】:

  • 是否使用相同的时区?也许改用 DateTime.UtcNow?

标签: c# sql sql-server datetime datediff


【解决方案1】:

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

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

【讨论】:

  • int differenceInDays = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day).Subtract(new DateTime(otherDate.Year, otherDate.Month, otherDate.Day) );
  • 似乎不起作用,因为我减去的日期已经去掉了时间(即,它的 10/1/2011 00:00:00),所以它返回相同( 0),而 sql datediff 返回 1
  • DateTime.Now() 没有剥离时间(一种情况除外)
  • 对,但是在 sql 和 c# 中给定相同的日期时间,它们应该返回相同的值,但似乎没有 - 除非我按照@itsmat 所说的去做,即减去 .Date - 它无论如何都很有帮助,所以 +1!
  • 我不会争辩说 itsmatt 和 Stealth Rabbi 的答案并不干净,接受任何一个对我来说都很好。但我的回答确实得出了相同的答案。也许你错过了.Subtract(CurrentDate.TimeOfDay) 部分。
【解决方案2】:

10/1/2011 距离 DateTime.Now 不到 1 天。由于您要返回一个 TimeSpan,然后对其应用 Days,因此您将返回一个小于 1 天的 TimeSpan。所以它会返回 0 天。

相反,只需使用这些 DateTimes 的 Date 组件,它就会正确报告相隔天数 - 如下所示:

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

这将为您带来 1 天的收益。

【讨论】:

  • 这行得通...我认为关键是减去“日期”,而不仅仅是日期时间变量...
【解决方案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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多