2012-02-28 34 views
1

我想弄清楚如何在NHibernate中編寫查詢,以便返回的結果是用戶特定時區的特定日期。目前系統中的所有日期都以UTC格式存儲,我將時區標識與當前登錄的用戶一起存儲。通過使用sql查詢將UTC日期轉換爲用戶時區的日期,我們能夠在sql中進行查詢。現在我們轉換到使用NHibernate。下面的代碼是我試圖完成,但NHibernate拋出「System.DateTime添加(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 2012-02-28 04:09:23

+1

爲什麼不在查詢之外進行時區調整?無論如何,這似乎最好避免在數據庫上工作。 shanabus - – 2012-02-28 04:09:58

+0

- 表格結構非常簡單。包含三列:(Id - VARCHAR(40))(Energy - FLOAT)(TimeStamp - DATETIME) – PCG 2012-02-28 13:12:45

回答

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

感謝您的重播演示。但是,我搞亂了我想要完成的事情。我需要的是能夠查詢用戶時區的給定日期(年,月,日)的所有記錄。如果我將用戶時間轉換爲utc,那麼我只是獲取特定UTC日期的所有記錄? – PCG 2012-02-28 13:11:21

+0

QueryOver只通過where操作符提供非常簡單的布爾邏輯。它將.Net表達式轉換爲SQL的能力非常有限。 – 2012-02-28 23:06:39