Как получить ГОД из DATETIME, используя DATEPART в HQL - PullRequest
1 голос
/ 06 марта 2012

Я новый пользователь в 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 ]

6 голосов
/ 07 марта 2012

Я основываю это на диалекте 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 голос
/ 07 марта 2012

Функция year уже сопоставлена ​​внутри, поэтому:

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

Это зарегистрировано MsSql2000Dialect (от которого наследуются более новые диалекты MSSQL).

Теперь этопредполагает, что Product_Source - это имя вашего класса, что нечетно, поскольку оно не соответствует обычным соглашениям .NET (вам следует опустить подчеркивание)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...