将SQL转换为NHibernate HQL

将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)) 一些开始的东西 选择生

我应该将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))

一些开始的东西

选择生日介于现在-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)