使用日期时间比较的 Linq 查询未按预期工作

本文关键字:工作 查询 Linq 日期 时间 比较 | 更新日期: 2023-09-27 18:32:55

大约在 2014/12/1 21:40:12 PM,以下代码检索空值。

Campaign camp = repo.Campaigns
                    .Where(ca => ca.StartTime <= DateTime.Now)
                    .Where(ca => ca.EndTime >= DateTime.Now)
                    .FirstOrDefault();

当数据库中存在具有以下值的广告系列时:

Start Time:
2014-11-30 00:00:00.000
End Time:
2014-12-02 00:00:00.000

我完全不知为什么会发生这种情况。

使用日期时间比较的 Linq 查询未按预期工作

试试这个:

Campaign camp = repo.Campaigns
            .Where(ca => ca.StartTime.Value.Date <= DateTime.Now.Date && ca.EndTime.Value.Date >=DateTime.Now.Date).FirstOrDefault(); 

您是否考虑了时区信息?数据库中存储的数据可能是从运行在另一个时区的计算机创建的,您的 DateTime 对象将具有另一个时区,当它们传递到数据库时,它们可能会超过 EndTime。

您的代码在处理内存中数据时有效,因此问题可能与时区有关。

要评论其他内容:1.不要链接多个.哪里子句,你可以用一个来做。2. 不要使用 DateTime.Now,将 DateTime.Now 存储在一个值中,然后将其传递到 LINQ 中,否则将针对两个不同的值比较 StartTime 和 EndTime。

var now = DateTime.Now;
Campaign camp = repo.Campaigns
                    .Where(ca => ca.StartTime <= now && ca.EndTime >= now)
                    .FirstOrDefault();

您首先选择的日期时间小于当前值。假设您有 2 个结果。接下来,对于这两个结果,您将查询超过当前值的日期时间!结果小于当前日期,因此显然它们永远不会超过当前日期值。我猜您正在尝试执行以下操作:

Campaign camp = repo.Campaigns
        .Where(ca => ca.StartTime.Value.Date <= DateTime.Now.Date **||** ca.EndTime.Value.Date >=DateTime.Now.Date).FirstOrDefault(); 
之所以

发生这种情况,是因为您比较的时间(如"开始时间"和"结束时间")的日期格式与"日期时间"的区域不同。现在正在选取

**

DateTime.Now- 12/1/2014 9:40:12 PM
Start Time: 2014-11-30 00:00:00.000
End Time: 2014-12-02 00:00:00.000

**

更改日期时间。现在日期格式与"开始时间"和"结束时间"的格式相同2014-12-01 9:40:12 下午

然后比较我相信你会得到结果