实体框架:Linq where子句比较日期和时间值与秒差

时间:2017-04-18 05:37:45

标签: c# entity-framework linq datetime azure-sql-database

var onLineP = (from od in db.RTLS_ONLINEPERSONSTATUS
               where (lsdAts <= od.created_time && od.created_time <= DateTime.Now)
               select od).ToList();

在上面的查询中,我得到的是前几天的记录,但不是当天的记录。我使用Entity框架作为我的orm和azure-sql作为后端。 RTLS_ONLINEPERSONSTATUS表分别有两个记录 创建时间分别为4/17/2017 10:00:09 AM,4/18/2017 10:00:09 。我正在记录 创建的时间值= 4/17/2017 10:00:09 AM 并且未获得 当天(4/18 / 2017上午10:00:09) 记录。 lsdAts(服务器上的最后同步日期)= {4/6/2017 10:34:09 AM}。

2 个答案:

答案 0 :(得分:0)

最后我得到了解决问题的方法。隐藏的问题是我的sql服务器位于南 - Acia,我从南印度访问它,所以时区不匹配,因为Linq在运行时将Datetime.Now转换为SysDateTime()。为了解决这个问题,我在Datetime.Now中添加了330分钟(即5小时30分钟),如下面的代码片段所示。

  var onLineP = (from od in db.RTLS_ONLINEPERSONSTATUS
                where (lsdAts <= od.created_time && od.created_time <= DbFunctions.AddMinutes(DateTime.Now, 330))
                                           select od).ToList(); 

答案 1 :(得分:0)

正如我所提到的,它与时区差异有关。我建议仅在比较时间时使用UTC。它还意味着还要将数据库中的时间保留在UTC中。最终代码看起来应该是这样的:

  var onLineP = (from od in db.RTLS_ONLINEPERSONSTATUS
  where (lsdAts <= od.created_time_utc && od.created_time_utc <= DateTime.Now.ToUniversalTime())
  select od).ToList();