从Web API服务器查询linq时,数据库混淆的UTC

时间:2016-01-27 01:08:42

标签: c# sql datetime asp.net-web-api utc

我可以真正使用一些帮助来解决我根据SQL Date字段查询数据的问题。

我使用以下代码以UTC格式存储日期:

objFitCalendarDto.Day = objFitCalendarDto.Day.ToUniversalTime();

该行将日期分配给通过Entity Framework插入到db中的模型。

现在,我的查询应该根据日期检索一行。所以,我应该能够获得今天,明天,昨天等等的排名。

为此,我使用该方法在两个日期,开始日期和结束日期之间进行搜索,如下所示:

DateTime dayBegin = DateTime.Today.Date.AddDays(dayOffset);
DateTime dayEnd = DateTime.Today.Date.AddDays(dayOffset + 1);

dayOffset的目的是指定哪一天。如果Offset为0,那么我正在搜索Today。如果dayOffset为1,那么我正在搜索明天日期的行。

现在,由于我最初以UTC格式存储数据,因此我假设我必须在UTC中搜索它。所以在执行我的查询之前,我将日期转换为UTC,如下所示:

dayBegin = TimeZoneInfo.ConvertTimeToUtc(dayBegin);
dayEnd = TimeZoneInfo.ConvertTimeToUtc(dayEnd);

然后我执行我的查询:

var query = (from f in Db.FitCalendars
    where f.FitProgramId == programId &&
          f.DayAsDate >= dayBegin && f.DayAsDate < dayEnd
          select f);

问题是,它不起作用。我有一行日期,&#34; 2016-01-26&#34;当我在SQL Manager中查看它时。但是,它仅在昨天的查询日期返回。顺便说一句,今天是2016-01-26。显然,我没有得到这个UTC概念。谁能看到我在这里做错了什么?我假设如果我将所有内容存储为UTC,然后在查询之前我将查询的日期转换为UTC,那么一切都应该有效。

1 个答案:

答案 0 :(得分:1)

<强>更新 让我们这样试试:

  1. 只要您只存储日期部分(SQL&#39;日期&#39;类型), 还需要比较日期。

  2. 而不是

  3. DateTime dayBegin = DateTime.Today.Date.AddDays(dayOffset);   
    dayBegin = TimeZoneInfo.ConvertTimeToUtc(dayBegin);
    

    让我们做吧

    DateTime dayBegin = DateTime.UtcNow.Date.AddDays(dayOffset);
    

    dayBegin在这种情况下将是时间日期(时间是凌晨12:00:00)。这意味着,我们需要使用 DbFunctions 截断它。我们需要平等检查。

    var query = (from f in Db.FitCalendars
        where f.FitProgramId == programId &&
              f.DayAsDate == DbFunctions.TruncateTime(dayBegin)
              select f);
    

    END OF UPDATE

    我认为问题在于您将日期与时间进行比较。在你的情况下,你需要只比较日期,据我所知。作为解决方案 - 使用DbFunctions TruncateTime函数。它可以在linq查询中使用 - 就像在代码中一样。

      

    https://msdn.microsoft.com/en-us/library/system.data.entity.dbfunctions.truncatetime(v=vs.113).aspx

    因此,完整的解决方案将是

    var query = (from f in Db.FitCalendars
        where f.FitProgramId == programId &&
              DbFunctions.TruncateTime(f.DayAsDate) >= DbFunctions.TruncateTime(dayBegin) && DbFunctions.TruncateTime(f.DayAsDate) < DbFunctions.TruncateTime(dayEnd)
          select f);