web-dev-qa-db-fra.com

HQL pour interroger les enregistrements entre deux dates

J'essaie d'interroger tous les enregistrements de clients utilisant HQL dans mon application Spring/Hibernate pour lesquels DateAdded est entre Date1 et Date2 OR LastSeen entre Date1 et Date2.

sessionfactory.getCurrentSession().createQuery("from Customer c where c.dateAdded BETWEEN '"+startDate+"' AND '"+endDate+"' OR c.lastSeenDate BETWEEN  '"+startDate+"' AND '"+endDate+"'").list();

J'ai débogué l'application pour vérifier les dates startDate et endDate et j'ai constaté qu'elles étaient envoyées en tant que:

startDate: mer. 22 janv. 01:16:57 HKT 2014

endDate: mer. 29 janv. 01:16:57 HKT 2014

Dans la base de données, je suis sûr à 100% qu’un enregistrement répondant au moins à cette requête, car cet enregistrement DateAdded et LastSeen sont les suivants:

2014-01-23 15:33:38

2014-01-25 15:33:38

Alors quelqu'un peut-il me dire ce que je fais mal/manque ici?

14
MChan
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String frmDate = format.parse(startDate);
String enDate = format.parse(endDate);
sessionfactory.getCurrentSession()
.createQuery("FROM Customer AS c WHERE c.dateAdded BETWEEN :stDate AND :edDate ")
.setParameter("stDate", frmDate)
.setParameter("edDate", enDate)
.list();

espérons que cela aidera!

15
Ashish Jagtap

Ceci est un ancien post, mais je pensais que cela pourrait aider quelqu'un. Définir .setTimeStamp devrait faire l'affaire. 

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String frmDate = format.parse(startDate);
String enDate = format.parse(endDate); 
sessionfactory.getCurrentSession()
.createQuery("FROM Customer AS c WHERE c.dateAdded BETWEEN :stDate AND :edDate ")
.setTimestamp("stDate", frmDate)
.setTimestamp("edDate", enDate)
.list();
6
Hans
SimpleDateFormat sf=new SimpleDateFormat("dd-MM-YYYY");
String fromDate=null;
String toDate=null;
fromDate=sf.format(startDate);
toDate=sf.format(endDate);
sessionfactory.getCurrentSession().createQuery("from Customer where dateAdded BETWEEN '"+startDate+"' AND '"+endDate+"'");
2
Altin Vijay

Il est important de savoir que lorsque vous utilisez BETWEEN, “setDate” tronque la valeur de date HQL passée en paramètre et ignore les heures, les minutes et les secondes. Il est très important de noter cela en particulier si vous avez une requête HQL vérifiant entre des dates de jours différents, car l'utilisation de «setDate» interprétera l'intervalle de dates comme se situant entre minuit des dates spécifiées.

La solution consiste à utiliser «setParameter» au lieu de «setDate», ce qui entraîne l'interprétation des valeurs de date HQL en tant que dates et heures.

voici quelques exemples sur mon site pour les personnes intéressées http://www.coding-dude.com/wp/Java/hql-date-datetime-quick-tip/

1
coding-dude.com

Vous devez annoter avec @JsonFormat de la même manière que les filtres de date et le champ de date comme suit:

Class Filter {
...
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd/MM/yyyy HH:mm", timezone="America/Sao_Paulo")
private Date startDate;
}

Class YourObject {
...

@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="dd/MM/yyyy HH:mm", timezone="America/Sao_Paulo")
private Date DateAdded;
}

Le modèle et le fuseau horaire doivent être ajustés à votre région.

0
Gui Alencar
SimpleDateFormat formatter = new SimpleDateFormat("MM-dd-yyyy");
    Calendar c = Calendar.getInstance();
    c.setTime(new Date()); // Now use today date.
    c.add(Calendar.DATE, 90);
    Date fromDate = null, toDate = null;
    String fromDateStr = formatter.format(new Date());
    String toDateStr = formatter.format(c.getTime());
    try {
        fromDate = formatter.parse(fromDateStr);
        toDate = formatter.parse(toDateStr);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    query.setParameter("stDate", fromDate);
    query.setParameter("edDate", toDate);
0
user9260527

J'ai eu le même problème. Lorsque nous utilisons la date de fin (mercredi 29 janvier), le système recherche le mercredi 29 janvier à 00:00:00, ce qui revient à choisir le 28 janvier. Pour éviter un tel cas, nous pouvons ajouter un jour à la date de fin. Cela explique également pourquoi nous n’avons pas de problème avec la date de début.

Étonnamment, ce problème n'existe pas lorsque nous utilisons des critères d'hibernation.

0
MR AND