如何在HQL中使用DATEPART从DATETIME获取YEAR

时间:2012-03-06 19:11:40

标签: c# sql nhibernate hql

我是StackOverflow的新用户,我需要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";

2 个答案:

答案 0 :(得分: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";

<击>

编辑正如迭戈所指出的那样,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";

答案 1 :(得分:1)

year函数已在内部映射,因此:

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

这是由MsSql2000Dialect注册的(新的MSSQL方言继承)。

现在,假设Product_Source是您的类的名称,这是奇怪的,因为它不遵循通常的.NET约定(您应该删除下划线)