16

HQLクエリ内で日付/時刻の計算を実行する方法を探しています。current_timestamp()具体的には、関数の結果から(x)時間を加算または減算するにはどうすればよいですか?または、このためにSQLにアクセスして、実行中のデータベースがそれをサポートすることを期待する必要がありますか?

HQLクエリの例:

FROM RandomThing
WHERE randomTime IS NOT NULL AND
      randomTime >= current_timestamp() AND
      randomTime <= (current_timestamp() + :timeToAdd)

:timeToSubtractパラメーターを特定の単位として定義できますが、時間よりも大きいものは望ましくなく、秒が最も望ましいでしょう。

明確化:これはクエリの外部で簡単に実行できることを理解しています。ただし、哲学的な理由から、クエリシステムの時刻ではなく、データベースサーバーの時刻を使用することが重要であるとしましょう。実用的な例:最後の(x)時間内に作成されたすべてのエントリの自動タイムスタンプをクエリしています。タイムスタンプはデータベースシステムによって作成されるため、データベースの現在の時刻も使用することが重要です。

4

4 に答える 4

10

なぜクエリでそれを行う必要があるのですか? Javaコードで処理しないのはなぜですか。

例えば:

From RandomThing
Where randomTime is not null and
      randomTime >= :currentTimestamp and
      randomTime <= :maxTimestamp

そして、パラメータを設定するだけです。

于 2009-03-12T20:27:01.037 に答える
4

データベースでSQLを使用して構文を決定し、カスタムHibernateDialect内で関数を定義できます。たとえば、標準SQLではない平日関数が必要でした。データベースごとに方言をサブクラス化し、次のような行を追加しました。

registerFunction("weekday", 
  new SQLFunctionTemplate(Hibernate.INTEGER, "to_char(?1,'D')") );

あなたの場合、?として定義されるかもしれないdate_diffと呼ばれる関数を使うことができます。-?一部のデータベースまたは他のデータベースとは異なるもの。そうすれば、クエリに生のSQLを記述する必要がなく、データベースを切り替える必要がある場合は、方言で関数を別の方法でマップするだけです。

于 2009-03-13T04:04:22.590 に答える
3

データベース サーバーの時間が必要な場合は、最初に単純な hql クエリを実行してタイムスタンプを取得し、次に java で maxTimestamp を計算し、取得したタイムスタンプと計算された maxTimeStamp を ccclark のようなクエリに渡します。

于 2009-09-15T12:12:12.957 に答える
1

HQLである必要がありますか?私はおそらく休止状態の基準に切り替えて使用します:

Criteria.add( Restrictions.SQLRestriction( "{alias} <= current_timestamp() " ) )
Criteria.add( Restrictions.SQLRestriction( "{alias} >= (current_timestamp() + ?) ", 5 )
于 2009-03-13T19:12:50.863 に答える