【问题标题】:How to extract hour from datetime in criteria?如何从标准中的日期时间中提取小时?
【发布时间】:2015-10-05 20:25:36
【问题描述】:

我必须写这样的东西:

SELECT * FROM foo WHERE HOUR(field) = 10

字段是日期时间。

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

我知道,我可以:

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

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

有什么办法吗?

【问题讨论】:

    标签: c# nhibernate orm criteria hibernate-criteria


    【解决方案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

    【讨论】:

      【解决方案2】:

      这会从日期时间获取小时数

      select DATEPART(HOUR, field) from tableName
      

      【讨论】:

      • 我非常专注于 NHibernate 的东西(期望 HOUR(column) 是一个函数)...您选择 HOUR 的 SQL 方式当然是 DB 上的方式边...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 2014-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      相关资源
      最近更新 更多