我应该将转换为SQL-Query转换为NHibernate HQL(NHibernate 3.2)。但我不知道,我如何翻译FLOOR,DATEDIFF和GETDATE。
SELECT Birthday FROM Person
WHERE 1 = (FLOOR(DATEDIFF(dd,Birthday,GETDATE()+10) / 365.25))
-
(FLOOR(DATEDIFF(dd,Birthday,GETDATE()-5) / 365.25))
答案 0 :(得分:2)
开始使用的东西。
选择生日,从现在起5天到现在+ 10天。
<击> 撞击>
<击> var today = DateTime.Now();
var results = session.CreateQuery("select p.Birthday from Person
where p.Birthday>= :from and p.Birthday<=:to")
.SetParameter("from", today.AddDays(10))
.SetParameter("to", today.Subtract(new TimeSpan(5, 0, 0, 0)))
.List<DateTime>();
击> <击> 撞击> 虽然我想你想要在一年中过生日。
为了在HQL中复制此查询,您将不得不使用此技术注册所需的特定SQL函数:
Register Custom SQL Function in NHibernate
然后,您应该能够在HQL中复制SQL查询。
这是关于SQL方面的一个很好的问题:
新鲜策略:
注册日期的SQL函数:
RegisterFunction("datediffdays",
new SQLFunctionTemplate(NHibernateUtil.Int32, "datediff(dd,?1, ?2)"));
HQL查询
var result = session.CreateQuery(@"from Person
where 1 = (floor(datediffdays(Birthday,current_timestamp()+10) / 365.25))
- (datediffdays(Birthday,current_timestamp()-5) / 365.25))")
.List<Person>();
答案 1 :(得分:0)
未经测试,但会是这样的: <击> 撞击>
<击>var dateStart = DateTime.Now.AddDays(-5).Ticks/365.25D;
var dateEnd = DateTime.Now.AddDays(10).Ticks/365.25D;
session.QueryOver<Person>()
.WhereRestrictionOn(x => x.Birthday.Ticks/365.25D)
.IsBetween(dateStart).And(dateEnd)
.List();
击> <击> 撞击> 这样做了吗?
看一下源代码,楼层已经在方言中注册,所以如下:
var result =
session.CreateQuery(@"from Person
where 1 = (FLOOR(DATEDIFF(dd,Birthday,GETDATE()+10) / 365.25))
-
(FLOOR(DATEDIFF(dd,Birthday,GETDATE()-5) / 365.25))")
.List<Person>();
生成以下SQL:
select person0_.Id as Id2_,
person0_.Birthday as Birthday2_
from [Person] person0_
where 1 = floor(DATEDIFF(dd,
person0_.Birthday,
GETDATE()
+ 10)
/ 365.25)
- floor(DATEDIFF(dd,
person0_.Birthday,
GETDATE()
- 5)
/ 365.25)