返された結果がユーザーの特定のタイムゾーンの特定の日付に対するものであるように、NHibernateでクエリを書き込む方法を理解しようとしています。現在、システム内のすべての日付はUTC形式で保存されており、現在ログインしているユーザーにタイムゾーンIDを保存します。 UTCの日付をsqlクエリーを使用してユーザーのタイムゾーンの日付に変換することで、sqlでクエリーできました。今我々はNHibernateの使用に変換しています。以下のコードは私が達成しようとしているものですが、NHibernateは "System.DateTime Add(System.TimeSpan)"でNotSupportedExceptionをスローしますが、これは問題ないかどうかはわかりませんが、MySQLデータベースサーバの後に行きます。NHibernate UTC日付フィールドによる照会
var readings =
session.Query<EnergyReading>()
.Where(x => x.TimeStamp.Add(usersTimeZone.BaseUtcOffset).Date == usersTime.Date && x.DeviceId == deviceId);
SOLUTION
私は私の状況で働いていた次のを思い付いた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);
このコードが生成するクエリは何ですか。また、あなたの 'mysql'テーブルはどのようなものですか? – shanabus
タイムゾーンの調整をクエリの外で行わないのはなぜですか?これは、とにかく、とにかくデータベースでの作業を避けることが望ましいと思われます。 –
shanabus - テーブル構造はとてもシンプルです。 (Id - VARCHAR(40))(Energy - FLOAT)(TimeStamp - DATETIME) – PCG