将SQL转换为NHibernate HQL
我应该将fallowing SQL查询转换为NHibernate HQL NHibernate 3.2。但我不知道如何翻译地板,DATEDIFF和GETDATE将SQL转换为NHibernate HQL,sql,nhibernate,hql,Sql,Nhibernate,Hql,我应该将fallowing SQL查询转换为NHibernate HQL NHibernate 3.2。但我不知道如何翻译地板,DATEDIFF和GETDATE SELECT Birthday FROM Person WHERE 1 = (FLOOR(DATEDIFF(dd,Birthday,GETDATE()+10) / 365.25)) - (FLOOR(DATEDIFF(dd,Birthday,GETDATE()-5) / 365.25)) 一些开始的东西 选择生
SELECT Birthday FROM Person
WHERE 1 = (FLOOR(DATEDIFF(dd,Birthday,GETDATE()+10) / 365.25))
-
(FLOOR(DATEDIFF(dd,Birthday,GETDATE()-5) / 365.25))
一些开始的东西 选择生日介于现在-5天和现在+10天之间的生日 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>();
未经测试,但会出现以下情况:
你想干什么?我无法读取该查询。@Phill-Definition of FLOOR:返回小于或等于指定数值表达式的最大整数。FLOORDATEDIFFdd,生日,GETDATE+10/365.25给出了10天内的年龄-FLOORDATEDIFFdd,生日,GETDATE-5/365.25给出了过去5天的年龄。如果两者的差值为1,则生日介于过去的5天(从现在开始)和未来的10天之间。是的,我的选择为我提供了鸟日,而不考虑年份。我现在不知道该怎么做才能在HQL中使用MS SQL Server关键字。@t.kehl您可以使用此技术创建自定义方言并注册所需的SQL函数:@t.kehl尽管我必须承认我从未尝试过像您需要的那样嵌套自定义SQL函数。-源代码显示楼层已注册。C中的刻度从1/1/0001开始工作,但在SQL Server中,它们从不同的日期开始工作,具体取决于列类型,DateTime SQL 2000与DateTime2 SQL 2008。@标记-好的一点,我没想到这一点。现在想起来显然太晚了。这给了我一个例外消息:无法从Convertx.birth.Value.Ticks/365,25确定成员。生日对我来说是一个可空的DateTime。@t.kehl-我划掉了这个解决方案,因为Marks对.NET和SQL Server之间的日期时间差异发表了评论。
RegisterFunction("datediffdays",
new SQLFunctionTemplate(NHibernateUtil.Int32, "datediff(dd,?1, ?2)"));
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>();
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>();
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)