Frage

Ich bin auf der Suche, wie Datum / Uhrzeit Mathematik innerhalb einer HQL-Abfrage auszuführen. Genauer gesagt, wie kann ich (x) viel Zeit aus dem Ergebnis der current_timestamp() Funktion addieren oder subtrahieren? Oder muss ich für diese in SQL fallen und hoffen, dass alles, was Datenbank wird ausgeführt unterstützt?

HQL Abfrage Beispiel:

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

kann ich definieren: timeToSubtract Parameter eine bestimmte Einheit zu sein, obwohl etwas größer als Stunden unerwünscht wäre, und Sekunden wären sehr wünschenswert

.

ERKLÄRUNG: Ich weiß, das leicht außerhalb der Abfrage durchgeführt werden kann. Aber aus philosophischen Gründen, lassen Sie sich sagen, es ist wichtig, den Datenbankservers Zeit zu verwenden, anstatt die Zeit des abfragenden Systems. Praktisches Beispiel: Ich bin eine automatische Zeitstempel für alle innerhalb des letzten (x) viel Zeit Eingaben abfragt. Da der Zeitstempel durch das Datenbanksystem durchgeführt wird, ist es wichtig, auch die aktuelle Uhrzeit der Datenbank zu verwenden.

War es hilfreich?

Lösung

Wenn Sie den Datenbankservers Zeit benötigen, könnten Sie zunächst eine einfache HQL Abfrage tun, um die Zeitstempel zu bekommen und dann die maxTimestamp in Java berechnen und die abgerufenen Zeitstempel und die berechnete maxTimeStamp auf eine Abfrage wie die von ccclark passieren.

Andere Tipps

Warum brauchen Sie es in der Abfrage zu tun? Warum nicht einfach handhaben es in der Java-Code.

Beispiel:

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

Und dann setzen Sie einfach die Parameter.

Sie können die Syntax bestimmen, es zu tun SQL in Ihrer Datenbank verwenden und dann eine Funktion innerhalb einer benutzerdefinierten HibernateDialect definieren. Zum Beispiel, brauchten wir eine Wochentag-Funktion, die nicht Standard-SQL ist. Wir subclassed den Dialekt für jede Datenbank und fügte dann eine Zeile wie diese:

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

In Ihrem Fall könnten Sie eine Funktion namens verwenden date_diff, die wie folgt definiert werden könnten? -? in einigen Datenbanken oder etwas anderes in anderen. Auf diese Weise müssen nicht roh SQL in Ihrer Abfrage schreiben, und wenn Sie jemals Datenbanken müssen wechseln, ordnen Sie nur die Funktion unterschiedlich in Ihrem Dialekt.

Hat es HQL sein? Ich würde wahrscheinlich zu Hibernate Kriterien schalten und zu verwenden:

Criteria.add( Restrictions.SQLRestriction( "{alias} <= current_timestamp() " ) )
Criteria.add( Restrictions.SQLRestriction( "{alias} >= (current_timestamp() + ?) ", 5 )
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top