2015-10-05 129 views
1

我不得不寫類似:如何在標準中從日期時間提取小時?

SELECT * FROM foo WHERE HOUR(field) = 10 

如果字段是日期時間。

我想忽略日期 - 爲了統計的目的,我只需要提取發生在10:00和10:59之間的事件。

我知道,我可以:

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

但我想使用Hibernate的機制,而不是SQL字符串。

有沒有辦法做到這一點?

回答

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的上下的解決方案 - 的情況下,我們想使用該功能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

這也會從日期時間時間

select DATEPART(HOUR, field) from tableName 
+0

我是如此集中在NHibernate的東西*(期待'HOUR(列)'是一個函數)* ...你的SQL-ish方式選擇HOUR當然是DB方面的方式...... –

相關問題