Если бы вы создали запрос непосредственно в SQL, вы бы использовали функцию datepart. Этот вопрос касается вызова функции datepart из NHibernate. В основном вы используете проекцию NHibernate: Projection.SqlFunction.
Что немного усложняет, так это то, что вам нужно иметь несколько проекций, по одной на час, минуту и секунду (в зависимости от необходимой детализации). Кроме того, я не нашел способа вызвать datepart напрямую, так как не смог найти способ передать параметр datepart (это строковая константа без кавычек). Вместо этого вы можете расширить диалект так:
public class MsSql2008ExtendedDialect : MsSql2008Dialect
{
public MsSql2008ExtendedDialect()
{
RegisterFunction("DATEPART_HOUR", new SQLFunctionTemplate(NHibernateUtil.DateTime, "datepart(hh, ?1)"));
}
}
EDIT:
Однако я хотел бы предостеречь, чтобы принять к сведению производительность запросов. Поскольку по времени дня нет индекса, даже если в столбце даты есть индекс, производительность запросов может снизиться, если имеется много записей, и это единственный столбец, на который накладываются ограничения. В этом случае может быть лучше добавить явные столбцы для часа / минуты.