2012-03-06 40 views
1

我在StackOverflow的新用戶,我需要在HQL字符串中的幫助下,DATETIME得到YEAR ..如何使用DATEPART在HQL

在SQL我的查詢是這樣的..

SELECT DISTINCT DATEPART(yyyy, Moment) AS Year, 
FROM PRODUCT_SOURCE 

我該如何將其轉換爲HQL?

我已經試過這一點,但沒有奏效..

query = "SELECT DISTINCT DATEPART(year, p.Moment) as Year, " + 
     "FROM Product_Source as p"; 
+0

我不知道很多關於NHibernate的(你應該放棄下劃線)的名稱,但是你的代碼會生成一個DateTime列表,對嗎?您無法從.NET DateTime對象獲取年份? – Fabio 2012-03-06 19:14:33

+0

'to_date(p.moment,'yyyy')'? http://stackoverflow.com/q/5132624/1176601 – Aprillion 2012-03-06 19:38:10

+0

嗨法比奧,感謝您的答案..但我想在檢索只有一個獨特的年描述(使用DISTINCT)..但是,我已經在C#編程.. – Godinho 2012-03-07 02:07:28

回答

6

我此基礎上SQL2008方言,以便改變,你認爲合適。

public class MsSql2008ExtendedDialect : MsSql2008Dialect 
{ 
    public MsSql2008ExtendedDialect() 
    { 
    RegisterFunction("DATEPART_YEAR", 
     new SQLFunctionTemplate(NHibernateUtil.DateTime, "datepart(year, ?1)")); 
    } 
} 

,並使用你會用你的HQL這樣

query = "SELECT DISTINCT DATEPART_YEAR(p.Moment) as Year, " + 
     "FROM Product_Source as p"; 

編輯迭戈相當righly指出大部分在MSSQL服務器的功能已經註冊。有關完整列表,請參閱https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Dialect/MsSql2000Dialect.cs

所以只需使用: -

query = "SELECT DISTINCT year(p.Moment) as Year, " + 
     "FROM Product_Source as p"; 
+2

無需手動註冊; 'year'已經在那裏了。 – 2012-03-07 18:44:11

+0

感謝迭戈,發現這些功能註冊的源文件。 – Rippo 2012-03-07 20:10:25

+0

感謝您的所有答案。 – Godinho 2012-03-09 17:17:53

1

year功能已在內部映射,所以:

SELECT DISTINCT year(p.Moment) as Year, 
FROM Product_Source as p 

這是由MsSql2000Dialect(從較新的MSSQL註冊方言繼承)。

現在,這個假設Product_Source是你的類,這是奇怪的,因爲它沒有按照通常的.NET公約