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