2012-02-28 72 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