2012-02-28 6 views
1

返された結果がユーザーの特定のタイムゾーンの特定の日付に対するものであるように、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); 
+0

このコードが生成するクエリは何ですか。また、あなたの 'mysql'テーブルはどのようなものですか? – shanabus

+1

タイムゾーンの調整をクエリの外で行わないのはなぜですか?これは、とにかく、とにかくデータベースでの作業を避けることが望ましいと思われます。 –

+0

shanabus - テーブル構造はとてもシンプルです。 (Id - VARCHAR(40))(Energy - FLOAT)(TimeStamp - DATETIME) – PCG

答えて

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

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

UPDATE:

ユーザーのタイムゾーンの完全な一日と一致するように調整するには:

// 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); 
+0

再生用degorollsをありがとう。しかし、私は私が達成しようとしているものの私の例でうんざりしました。何が必要なのは、ユーザーtimezone.Ifの指定された日付(年、月、日)のすべてのレコードを照会できるようにすることです私はutc wouldntにユーザーの時間を変換する場合、私はちょうどその特定のUTCの日付のすべてのレコードを取得? – PCG

+0

QueryOverは、where演算子を使用して非常に単純なブール論理を提供します。 .Net表現をSQLに変換する能力は非常に限られています。 –

関連する問題