web-dev-qa-db-fra.com

Comment comparer les dates en veille prolongée

Dans ma base de données, les dates sont les suivantes: 2012-04-09 04:02:532012-04-09 04:04:512012-04-08 04:04:51, etc., je dois récupérer des données dont la date actuelle est indiquée dans le champ de date. Je veux dire que je dois faire correspondre que 2012-04-09'. Comment puis-je le faire en utilisant des critères d'hibernation.

16
Romi

Utilisez Restrictions.between () pour générer une clause where indiquant la colonne de date entre '2012-04-09 00:00:00' et '2012-04-09 23:59:59' 

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date fromDate = df.parse("2012-04-09 00:00:00");
Date toDate = df.parse("2012-04-09 23:59:59");

criteria.add(Restrictions.between("dateField", fromDate, toDate));

Veuillez noter que toutes les propriétés utilisées dans l'API Criteria sont le nom de la propriété Java, mais pas le nom de la colonne.


Mise à jour: obtenez les données fromDate et toDate pour la date actuelle à l'aide de JDK uniquement

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
Date fromDate = calendar.getTime();

calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
Date toDate = calendar.getTime();

criteria.add(Restrictions.between("dateField", fromDate, toDate));
29
Ken Chan

Comme ça?

criteria.add(Expression.eq("yourDate", aDate))
2
titogeo
fromDate.setTime(new Date());
fromDate.set(Calendar.HOUR_OF_DAY, 0);
fromDate.set(Calendar.MINUTE, 0);
fromDate.set(Calendar.SECOND, 0);
fromDate.set(Calendar.MILLISECOND, 0);

Ce code est extrêmement dangereux ... si le jour passe en heure d'été (par exemple, le 06.04.1980), vous vous retrouvez avec l'exception suivante !!!

 Java.lang.IllegalArgumentException: HOUR_OF_DAY: 0 -> 1day


HQL: from human pat where year(pat.birthdate) = :start_day and month(pat.birthdate) = :start_month and year(pat.birthdate) = :start_year ");

params.put("start_day", startDate.get(Calendar.DAY_OF_MONTH));
params.put("start_month", startDate.get(Calendar.MONTH) + 1);
params.put("start_year", startDate.get(Calendar.YEAR));

Les fonctions année/mois/jour utilisent les fonctions sous-jacentes de la base de données (extrait, ...) et ne comparent que ces valeurs. Par conséquent, je n'ai pas eu besoin de régler le temps sur 0, ce qui conduit à l'exception décrite ci-dessus . Juste un exemple de ma tête, comment j'ai résolu le problème! Peut-être que ça aide

2
Martin Gamper

Le moyen le plus simple consiste à récupérer tous les enregistrements ayant une date comprise entre le début et la fin d'un jour donné:

WHERE date BETWEEN :from AND :to

Et calculez from et to dans votre code Java.

Pour l'informatique minuit:

import static org.Apache.commons.lang.time.DateUtils.ceiling;
import static org.Apache.commons.lang.time.DateUtils.truncate;

Date someDay = new Date();
Date from = truncate(someDay, Calendar.DAY_OF_MONTH);
Date to = new Date(ceiling(someDay, Calendar.DAY_OF_MONTH).getTime() - 1);
1

Comment le faire à Hibernate a déjà été dit. Vous pouvez préparer les objets Timestamp dans le code Java à l'aide, par exemple, de l'approche suivante:

Calendar cFrom = Calendar.getInstance();
cFrom.setTime(new Date()); /* today */
cFrom.set(Calendar.HOUR_OF_DAY, 0);
cFrom.set(Calendar.MINUTE, 0);
cFrom.set(Calendar.SECOND, 0);
cFrom.set(Calendar.MILLISECOND, 0);
Timestamp from = new Timestamp(cFrom.getTime().getTime());
Calendar cTo = Calendar.getInstance();
cTo.setTime(new Date()); /* today */
cTo.set(Calendar.HOUR_OF_DAY, 23);
cTo.set(Calendar.MINUTE, 59);
cTo.set(Calendar.SECOND, 59);
cTo.set(Calendar.MILLISECOND, 999);
Timestamp to = new Timestamp(cTo.getTime().getTime());

final String QUERY = ""
  + "SELECT tr "
  + "FROM Type tr "
  + "WHERE tr.timestamp >= :timestampFrom AND tr.timestamp <= :timestampTo";
Query query = entityManager.createQuery(QUERY);
query.setParameter("timestampFrom", from);
query.setParameter("timestampTo", to);
@SuppressWarnings("unchecked")
List<Type> ts = (List<Type>)query.getResultList();
0
Jiri Patera
The following code will work

Calendar fromDate = Calendar.getInstance();
fromDate.setTime(new Date());
fromDate.set(Calendar.HOUR_OF_DAY, 0);
fromDate.set(Calendar.MINUTE, 0);
fromDate.set(Calendar.SECOND, 0);
fromDate.set(Calendar.MILLISECOND, 0);

Calendar toDate = Calendar.getInstance();
toDate.setTime(new Date());
toDate.set(Calendar.HOUR_OF_DAY, 23);
toDate.set(Calendar.MINUTE, 59);
toDate.set(Calendar.SECOND, 59);
toDate.set(Calendar.MILLISECOND, 999);

criteria.add(Restrictions.between("loadDate", fromDate.getTime(),
                    toDate.getTime()));
0
Mohd Kose Avase

// comparaison de date/heure Hibernate 4.3

     Select c from Customer c where c.date<{d '2000-01-01'}
0
TiyebM
Restrictions.between("dateColumn", midnight1, midnight2)
0
James Scriven