Как извлечь час из даты и времени в критериях?

Я должен написать что-то вроде:

SELECT * FROM foo WHERE HOUR(field) = 10

Где поле - дата и время.

Я хочу игнорировать даты - для целей статистики мне нужно извлечь только события, которые происходят между 10:00 и 10:59.

Я знаю что могу:

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

Но я хотел бы использовать механизмы гибернации, а не строки SQL.

Есть какой-либо способ сделать это?


person Jakub Szułakiewicz    schedule 05.10.2015    source источник


Ответы (2)


Простое решение. Должно работать так:

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

Проверьте: Как сравнить месяц даты с использованием критериев Nhibernate?

Решение в духе 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));

Проверьте: Использование функции SQL CONVERT через критерий nHibernate

person Radim Köhler    schedule 05.10.2015

Это получает часы от даты и времени

select DATEPART(HOUR, field) from tableName
person Mohammed Alasa'ad    schedule 05.10.2015
comment
Я был так сосредоточен на материалах NHibernate (ожидая, что HOUR(column) будет функцией)... ваш SQL-подобный способ выбрать HOUR, конечно же, на стороне БД... - person Radim Köhler; 05.10.2015