DbFunctions DiffDays给出了错误的答案

时间:2016-08-11 02:25:36

标签: c# linq datetime dbfunctions

我想从DataBase获取一个列表,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
MyDate:27/09/2017 09:35:00

请帮我查一下代码中出了什么问题?
谢谢

3 个答案:

答案 0 :(得分:2)

您应该执行DbFunctions.DiffDays(DateTime.Now,x.MyDate),因为它应该像从第二个参数中减去第一个参数一样工作,因此在您的情况下,DiffDays返回的是负数。

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

date1 > date2的结果将是< 0

date1 < date2的结果将是> 0

答案 1 :(得分: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);

答案 2 :(得分:0)

请在datediff函数的更多信息中查看。

  • 语法

    - DATEDIFF(datepart,startdate,enddate)

    - 使用示例

    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
    

你可以play with here