4

レコードを日付でグループ化し、それらのレコードの「税」フィールド値をカウントする射影クエリを NHibernate で作成したいと考えています。私の質問は、データベースには DateTime という値があるということです。時間ではなく日付だけでレコードをグループ化するにはどうすればよいですか。以下は私のコードです

template.Criteria.SetProjection(
                Projections.ProjectionList()
                .Add(Projections.GroupProperty("IssueDatetime"), "DateVal")
                .Add(Projections.Sum("Tax"), "TotalFare")
            );

データベースは、IssueDatetime フィールドを DateTime 型として格納します。日付ごとに税金を数え、時間部分を無視したい。上記の要件を手伝ってくれる人はいますか?

4

2 に答える 2

8

最初の投影には以下を使用します。

Projections.GroupProperty(
    Projections.SqlFunction("date",
                            NHibernateUtil.Date,
                            Projections.GroupProperty("IssueDateTime")))

NH 2.xの場合:

Projections.GroupProperty(
    Projections.SqlFunction(new SQLFunctionTemplate(
                                NHibernateUtil.Date,
                                "dateadd(dd, 0, datediff(dd, 0, ?1))"),
                            NHibernateUtil.Date,
                            Projections.GroupProperty("IssueDateTime")))
于 2010-12-08T23:41:57.610 に答える
2

SQL Server と T-SQL を想定すると、この ICriteria で十分です。

IList results = Session.CreateCriteria(typeof(Record), "record")
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.SqlGroupProjection("CONVERT(date, {alias}.[IssueDatetime]) AS [DateVal]", "CONVERT(date, {alias}.[IssueDatetime])", new[] { "DateVal" }, new IType[] { NHibernateUtil.Date }))
        .Add(Projections.Sum("Tax"), "TotalFare"))
    .List();

次の SQL が生成されます。

SELECT CONVERT(date, this_.[IssueDatetime]) AS [DateVal], sum(this_.Tax) as y1_ FROM IgnoreTime_Record this_ GROUP BY CONVERT(date, this_.[IssueDatetime])
于 2010-12-08T23:57:53.213 に答える