DbFunctions DiffDays 给出了错误的答案
DbFunctions DiffDays Gives wrong answer
我想从数据库中获取一个列表,其中 MyDate 是今天或明天。
我写了下面的代码。
_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());
}
记录了以下内容:
现在:2016 年 11 月 8 日 10:50:00
我的日期:27/09/2017 09:35:00
请帮我看看代码哪里出了问题?
谢谢
最简单的方法是用当前日期检查年月日。月份和年份应该相同。今天必须相同,明天必须少一天:
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);
请在此处查看 datediff 函数的更多信息。
语法
-- DATEDIFF(日期部分、开始日期、结束日期)
-- 用法示例
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
你应该做 DbFunctions.DiffDays(DateTime.Now,x.MyDate)
因为它应该像从第二个参数中减去第一个参数一样工作,所以在你的情况下,DiffDays 返回一个负数。
总结一下如果你有DbFunctions.DiffDays(date1,date2)
和date1 > date2
结果将是< 0
和date1 < date2
结果将是> 0
我想从数据库中获取一个列表,其中 MyDate 是今天或明天。
我写了下面的代码。
_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());
}
记录了以下内容:
现在:2016 年 11 月 8 日 10:50:00
我的日期:27/09/2017 09:35:00
请帮我看看代码哪里出了问题?
谢谢
最简单的方法是用当前日期检查年月日。月份和年份应该相同。今天必须相同,明天必须少一天:
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);
请在此处查看 datediff 函数的更多信息。
语法
-- DATEDIFF(日期部分、开始日期、结束日期)
-- 用法示例
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
你应该做 DbFunctions.DiffDays(DateTime.Now,x.MyDate)
因为它应该像从第二个参数中减去第一个参数一样工作,所以在你的情况下,DiffDays 返回一个负数。
总结一下如果你有DbFunctions.DiffDays(date1,date2)
和date1 > date2
结果将是< 0
和date1 < date2
结果将是> 0