DbFunctions DiffDays 给出了错误的答案

本文关键字:错误 答案 DiffDays DbFunctions | 更新日期: 2023-09-27 18:01:54

我想从数据库获取一个列表,MyDate今天在哪里或tomarrow。
我编写了以下代码。

_Log("Now: " + DateTime.Now.ToString());
var v = db_TS.TS_Test.Where(x => DbFunctions.DiffDays(x.MyDate,DateTime.Now) < 2);
foreach (var item in v.ToList())
{
     _Log("MyDate: " + item.MyDate.ToString());
}

记录以下内容:

现在: 11/08/2016 10:50:00
我的日期: 27/09/2017 09:35:00

请帮我找出代码中出了什么问题?
谢谢

DbFunctions DiffDays 给出了错误的答案

你应该

DbFunctions.DiffDays(DateTime.Now,x.MyDate)因为它应该像从第二个参数中减去第一个参数一样工作,所以在你的例子中,DiffDays 返回一个负数。

总结一下,如果你有DbFunctions.DiffDays(date1,date2)

date1 > date2结果将是< 0

date1 < date2结果将> 0

最简单的方法是使用当前日期检查年、月和日。月份和年份应该相同。今天的日子必须相同,明天少一天:

var v = db_TS.TS_Test.Where(x => x.MyDate.Year == DateTime.Now.Year &&
                                 x.MyDate.Month == DateTime.Now.Month && 
                                 x.MyDate.Day >= DateTime.Now.Day - 1);

编辑

如前所述,这种简单的方案不适用于边缘情况。

更好的选择是从今天减去一个日期,然后以天为单位检查结果。如果是明天,那么差值是 1 天,如果是今天,则差为 0。

var v = db_TS.TS_Test.Where(x => DateTime.Now.Subtract(x.MyDate).Days <= 1);

请在此处查看日期差异函数的更多信息。

  • 语法

    -- 日期差异 ( 日期部分 , 开始日期 , 结束日期 (

    -- 用法示例

      SELECT DATEDIFF(DAY, GETDATE(), GETDATE() + 1) AS DayDiff
      SELECT DATEDIFF(MINUTE, GETDATE(), GETDATE() + 1) AS MinuteDiff
      SELECT DATEDIFF(SECOND, GETDATE(), GETDATE() + 1) AS SecondDiff
      SELECT DATEDIFF(WEEK, GETDATE(), GETDATE() + 1) AS WeekDiff
      SELECT DATEDIFF(HOUR, GETDATE(), GETDATE() + 1) AS HourDiff
    

你可以在这里玩