Linq日期时间比较不起作用
我有以下代码:Linq日期时间比较不起作用,linq,Linq,我有以下代码: DateTime timeStamp = Convert.ToDateTime(Request.QueryString["TimeStamp"]); var result = (from rs in db.VRec where rs.TimeStamp == timeStamp &&
DateTime timeStamp = Convert.ToDateTime(Request.QueryString["TimeStamp"]);
var result = (from rs in db.VRec
where
rs.TimeStamp == timeStamp &&
rs.Fixure == wFixture
select rs).ToList();
即使传递了正确的时间戳,结果也显示为0
如果删除进行时间戳比较的部分:
rs.TimeStamp == timeStamp
代码运行良好
你知道为什么datetime比较可能不起作用吗
DateTime
有一个非常好的分辨率-很可能您正在比较仅以毫秒为单位的时间戳,这将失败。您可能需要以下内容:
DateTime now = DateTime.Now;
DateTime then = now.Add(TimeSpan.FromMilliseconds(1));
const int EPSILON_MS = 10;
if(now.Subtract(then).TotalMilliseconds < EPSILON_MS)
{
Console.WriteLine("More or less equal!");
}
DateTime now=DateTime.now;
DateTime then=now.Add(TimeSpan.frommilluses(1));
常数intε=10;
if(now.Subtract(then).total毫秒
从问题中,我不知道您是要将日期与时间进行比较,还是只比较日期部分。若你们只想比较日期,那个么下面的方法就行了
var result = (from rs in db.VRec
where
rs.TimeStamp.Date == timeStamp.Date &&
rs.Fixure == wFixture
select rs).ToList();
由于您使用了对db的一些引用,所以我觉得您是从数据库中获取记录(从问题或标记中看,您使用的ORM并不明显)。假设您使用的是实体框架,上述查询将失败,例外情况是.Date
没有直接转换为sql。如果是这样,您可以按照以下方式重写查询以使其正常工作
var result = (from rs in db.VRec
where
rs.TimeStamp.Day == timeStamp.Day &&
rs.TimeStamp.Month == timeStamp.Month &&
rs.TimeStamp.Year == timeStamp.Year &&
rs.Fixure == wFixture
select rs).ToList();
这种方法的好处是,您可以将属性与任意深度进行比较,即您可以在查询中比较
小时
、分钟
、秒
等。第二个查询在实体框架5中进行测试。Linq将执行的sql查询中的DateTime参数转换为DateTime2。
也就是说,当您进行比较时,实际执行的sql将比较DateTime和DateTime2。这个比较将DateTime“转换”为DateTime2,毫秒部分将扩展为更高的分辨率(我认为这是一种奇怪的方式,请启发我)
尝试执行以下sql:
declare @d1 datetime = '2016-08-24 06:53:01.383'
declare @d2 datetime2 = '2016-08-24 06:53:01.383'
declare @d3 datetime2 = @d1
select @d1 as 'd1', @d2 'd2', @d3 'converted'
select (case when (@d1 = @d2) then 'True' else 'False' end) as 'Equal',
(case when (@d1 > @d2) then 'True' else 'False' end) as 'd1 greatest'
最有可能的是,这种比较很有效。你用什么做时间戳?您是否在调试器中检查了这两个值以查看它们是否真的相等?您是否尝试过
rs.TimeStamp.Equals(TimeStamp)
?@JayPatel:==
和Equals
对日期时间
执行完全相同的操作(对于任何合理设计的类型,请仔细考虑)。