質問
HQLクエリ内で日付/時刻の計算を実行する方法を探しています。具体的には、 current_timestamp()
関数の結果に(x)時間を加算または減算するにはどうすればよいですか?または、これのためにSQLに立ち寄って、実行されているデータベースがそれをサポートすることを期待する必要がありますか?
HQLクエリの例:
FROM RandomThing
WHERE randomTime IS NOT NULL AND
randomTime >= current_timestamp() AND
randomTime <= (current_timestamp() + :timeToAdd)
:timeToSubtractパラメーターを特定の単位として定義できますが、時間よりも大きいものは望ましくなく、秒が最も望ましいでしょう。
明確化:これはクエリの外部で簡単に実行できることを理解しています。しかし、哲学的な理由から、クエリシステムの時間ではなく、データベースサーバーの時間を使用することが重要だとしましょう。実際の例:最後の(x)時間内に作成されたすべてのエントリの自動タイムスタンプを照会しています。タイムスタンプはデータベースシステムによって作成されるため、データベースの現在時刻も使用することが重要です。
解決
データベースサーバーの時間が必要な場合は、最初に単純なhqlクエリを実行してタイムスタンプを取得し、次にjavaでmaxTimestampを計算し、フェッチされたタイムスタンプと計算されたmaxTimeStampをccclarkのようなクエリに渡します。
他のヒント
クエリでそれを行う必要があるのはなぜですか?なぜJavaコードで処理しないのですか。
例:
From RandomThing
Where randomTime is not null and
randomTime >= :currentTimestamp and
randomTime <= :maxTimestamp
そして、パラメータを設定します。
データベースでSQLを使用して構文を決定し、カスタムHibernateDialect内で関数を定義できます。たとえば、標準SQLではない平日関数が必要でした。各データベースの方言をサブクラス化し、次のような行を追加しました:
registerFunction("weekday",
new SQLFunctionTemplate(Hibernate.INTEGER, "to_char(?1,'D')") );
あなたの場合、date_diffという関数を使用できますか? -?一部のデータベースまたは他のデータベースで異なるもの。そうすれば、クエリに生のSQLを記述する必要がなく、データベースを切り替える必要がある場合は、方言で関数を異なる方法でマッピングするだけです。
HQLである必要がありますか?私はおそらく休止状態の基準に切り替えて使用します:
Criteria.add( Restrictions.SQLRestriction( "{alias} <= current_timestamp() " ) )
Criteria.add( Restrictions.SQLRestriction( "{alias} >= (current_timestamp() + ?) ", 5 )