我试图弄清楚如何在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);
答案 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);