Frage

Eine Tabelle hat Timestamp-Spalte. Ein Beispielwert in dem kann 2010-03-30 13.42.42 sein. Mit Hibernate, ich mache eine Reihe Abfrage Restrictions.between ( "Spaltenname", VonDatum, toDate).

Das Hibernate Mapping für diese Spalte ist wie folgt.

<property name="orderTimestamp"  column="order_timestamp" type="java.util.Date" />

Lassen Sie uns sagen, ich möchte alle Datensätze, die das Datum 30. März 2010 und 31. März 2010. Ein herausfinden müssen, Bereich Abfrage auf diesem Gebiet wird wie folgt.

Date fromDate = new SimpleDateFormat("yyyy-MM-dd").parse("2010-03-30");
Date toDate = new SimpleDateFormat("yyyy-MM-dd").parse("2008-03-31");
Expression.between("orderTimestamp", fromDate, toDate);

Das funktioniert nicht.

Die Abfrage wird an den jeweiligen Zeitstempel umgewandelt als „2010-03-30 00:00:00“ und „2010-03-31 00:00:00“. So werden alle Datensätze für den 31. März 2010, werden ignoriert.

Eine einfache Lösung für dieses Problem könnte sein, das Enddatum zu haben, als „2010-03-31 23.59.59.“ Aber, ich möchte wissen, ob es Art und Weise ist nur das Datum Teil der Timestamp-Spalte zu entsprechen.

Auch ist Expression.between() inklusive beiden Grenzen? Dokumentation wirft kein Licht auf diesem.

Keine korrekte Lösung

Andere Tipps

  

, ich möchte wissen, ob es Art und Weise ist nur das Datum Teil der Timestamp-Spalte zu entsprechen.

Wenn Sie nicht über einen TIMESTAMP, verwenden Sie einen DATE (und sollten Sie nicht type="date" verwenden?).

  

Auch ist Expression.between () inklusive beiden Grenzen?

Es scheint, dass das Verhalten der SQL Operator BETWEEN ist Datenbank abhängig . Mit PosgreSQL, die zwischen Ausdruck:

x BETWEEN y AND z

ist semantisch äquivalent zu:

y <= x AND x <= z

d. inklusive.

Die "2010-03-31 23.59.59." Grenzbedingung ist potenziell gefährlich: wenn es eine Transaktion im System 23.59.59 bis 00.00.00 ist, können Sie es vermissen würden. Wenn Sie genug Transaktionen täglich und eine lange genug Zeit haben, ein Bericht brechen wird, und Sie werden Stunden damit verbringen, um herauszufinden, warum.

PostgreSQL between umfasst die Grenzen so wäre es nicht auch sicher sein, das Enddatum 2010-04-01 00:00:00 gesetzt. Verwendung lt () und gt () sicher sein.

Vielleicht können Sie orderTimestamp zu einem DATE CAST. HQL tut Unterstützung haben hierfür.

Mit cast (your_data, Datum), erinnere mich an die zweite arg der gegossenen Funktion sein muss niedriger oder es wird nicht funktionieren.

Att .: Samuel \ Maycon

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top