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の1つ。
なぜクエリでそれを行う必要があるのですか? 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 )