NHibernate通过UTC日期字段查询

时间:2012-02-28 02:42:15

标签: c# .net visual-studio-2010 nhibernate fluent-nhibernate

我试图弄清楚如何在NHibernate中编写查询,以便返回的结果是针对用户特定时区的特定日期。目前,系统中的所有日期都以UTC格式存储,我将时区ID与当前登录的用户存储在一起。我们能够通过使用sql查询将UTC日期转换为用户时区的日期来查询sql。现在我们转换为使用NHibernate。下面的代码是我想要完成的,但是NHibernate在“System.DateTime Add(System.TimeSpan)”上抛出了一个NotSupportedException,也不确定这是否重要,但我是在追踪MySQL数据库服务器。

    var readings = 
           session.Query<EnergyReading>()
          .Where(x => x.TimeStamp.Add(usersTimeZone.BaseUtcOffset).Date == usersTime.Date && x.DeviceId == deviceId);

根据degorolls建议我想出了以下哪些适用于我的情况。

        var usersTime = Utility.GetCurrrentUsersDateTime();
        var afterDate = TimeZoneInfo.ConvertTimeToUtc(usersTime.Date);
        var beforeDate = TimeZoneInfo.ConvertTimeToUtc(usersTime.Date.AddDays(1));

        var energyReadingsList = context.Session.Query<EnergyReading>()
            .Where(x => x.TimeStamp > afterDate && x.TimeStamp < beforeDate)
            .OrderByDescending(x => x.TimeStamp)
            .ToList();
        Utility.ConvertEnergyReadingDatesToUsersTimeZone(energyReadingsList);

1 个答案:

答案 0 :(得分:1)

var usersTimeUTC = usersTime.Date.Add(-usersTimeZone.BaseutcOffset);

var readings = 
           session.Query<EnergyReading>()
          .Where(x => x.TimeStamp == usersTimeUTC && x.DeviceId == deviceId);

<强>更新

要调整以匹配用户时区的全天:

// You might want to do adjust lines below to do a more precise adjustment based 
// on the actual date to properly account for daylight savings.
var usersTimeUTCStart = usersTime.Date.Add(-usersTimeZone.BaseUtcOffset);
var usersTimeUTCEnd = usersTimeUTCStart.AddHours(24);

    var readings = 
               session.Query<EnergyReading>()
              .Where(x => x.TimeStamp >= usersTimeUTCStart && 
                   x.TimeStamp < usersTimeUTCEnd && 
                   x.DeviceId == deviceId);