NHibernate按UTC日期字段查询

本文关键字:字段 查询 日期 UTC NHibernate | 更新日期: 2023-09-27 18:25:56

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

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

解决方案

根据德戈罗尔斯的建议,我想出了以下适合我的方法。

        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);

NHibernate按UTC日期字段查询

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);