Question

Une table comporte colonne d'horodatage. Une valeur d'échantillon qui pourrait être 2010-03-30 13:42:42. Avec Hibernate, je fais une Restrictions.between de requête de gamme (colonne "nom", fromDate, toDate).

Le mappage de mise en veille prolongée de cette colonne est la suivante.

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

Disons que je veux savoir tous les enregistrements qui ont la date 30 Mars 2010 et le 31 Mars 2010. Une requête de gamme dans ce domaine se fait comme suit.

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);

Cela ne fonctionne pas.

La requête est convertie en horodatages respectifs « 30/03/2010 00:00:00 » et « 31.03.2010 00:00:00 ». Ainsi, tous les records pour le 31 Mars 2010 est ignoré.

Une solution simple à ce problème pourrait être d'avoir la date de fin comme « 2010-03-31 est 23:59:59. » Mais, je voudrais savoir s'il y a moyen de faire correspondre uniquement la partie date de la colonne d'horodatage.

Aussi, est-Expression.between() compris les limites? La documentation ne jette aucune lumière sur ce point.

Pas de solution correcte

Autres conseils

  

, je voudrais savoir s'il y a moyen de faire correspondre uniquement la partie date de la colonne d'horodatage.

Si vous ne voulez pas TIMESTAMP, utilisez une date (et vous ne devriez pas utiliser type="date"?).

  

En outre, est Expression.between (), y compris des deux limites?

Il semble que le comportement de SQL opérateur BETWEEN est . Avec PosgreSQL, l'expression ENTRE:

x BETWEEN y AND z

est sémantiquement équivalent à:

y <= x AND x <= z

i.e.. inclus.

Le "2010-03-31 est 23:59:59." condition de frontière est potentiellement dangereuse: s'il y avait une transaction dans le système entre 23:59:59 et 00:00:00 vous me manquerait. Si vous avez suffisamment de transactions par jour et une période assez longue, un rapport va casser et vous passerez des heures pour savoir pourquoi.

PostgreSQL between comprend les limites il ne serait pas même être sûr de fixer la date de fin à 2010-04-01 00:00:00. Utilisez lt () et gt () pour être sûr.

Peut-être que vous pouvez CAST orderTimestamp à une date. HQL n'a pas le support pour cela.

Utilisez fonte (your_data, date), rappelez-vous la deuxième arg de la fonction coulée doit être inférieure ou il ne fonctionnera pas.

Att .: Samuel \ Maycon

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top