我可以真正使用一些帮助来解决我根据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,那么一切都应该有效。
答案 0 :(得分:1)
<强>更新强> 让我们这样试试:
只要您只存储日期部分(SQL&#39;日期&#39;类型), 还需要比较日期。
而不是
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);