如何从条件中的datetime中提取小时数?

时间:2015-10-05 11:09:48

标签: c# nhibernate orm criteria hibernate-criteria

我必须写一些类似的东西:

SELECT * FROM foo WHERE HOUR(field) = 10

其中field是datetime。

我想忽略日期 - 出于统计目的,我只需要提取在10:00到10:59之间发生的事件。

我知道,我可以:

String sql = "HOUR(CREATED_AT) = 10";
criteria.add(Expression.sql(sql));

但我想使用hibernate机制,而不是SQL字符串。

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

简单的解决方案 - 应该像这样工作:

var hourProjection = Projections
     .SqlProjection(" DATEPART(HOUR,field) as hour "  // the left side of the expression
                   , new[] {"hour"}          // alias  
                   , new IType[] {NHibernateUtil.Int32}); // type is int

criteria.Add(Expression.Eq(hourProjection, myValue)); // myValue = 10

检查:How to compare datepart Month using Nhibernate Criteria?

NHibernate-ish解决方案 - 如果我们想广泛使用该函数HOUR,我们可以扩展Dialect及其定义:

public class CustomMsSql2012Dialect : MsSql2012Dialect
{
    public CustomMsSql2012Dialect()
    {
        RegisterFunction("HOUR", 
            new SQLFunctionTemplate(NHibernateUtil.Class, "DATEPART(HOUR,?1)"));
    }
}

并将其注入配置:

<property name="dialect">MyLib.CustomMsSql2012Dialect,MyLib</property>

并按照这样消费:

var hourFunctionProjection = Projections
  .SqlFunction("HOUR", NHibernateUtil.Int32, Projections.Property("Field"));

restrictions.Add(Restrictions.Eq(hourFunctionProjection, 10));

检查:Using SQL CONVERT function through nHibernate Criterion

答案 1 :(得分:1)

从日期时间开始获取小时数

select DATEPART(HOUR, field) from tableName