3

我有以下代码:

        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

代码工作正常。

关于为什么日期时间比较可能不起作用的任何想法?

4

3 回答 3

2

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!");
}
于 2013-07-19T19:50:37.990 回答
2

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' 
于 2016-09-12T21:55:46.437 回答
0

从问题中,我不知道您是要比较日期与时间还是仅比较日期部分。如果您只想比较日期,那么以下将起作用

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();

这种方法的好处是您可以将属性与任意深度进行比较,即您可以在查询中比较、Hours等。第二个查询在实体框架 5 中进行了测试。MinutesSeconds

于 2013-07-19T20:38:22.940 回答