web-dev-qa-db-fra.com

Critères de mise en veille prolongée pour les dattes

Dans Oracle, j'ai des dates au format

17-avril-2011 19: 20: 23.707000000

Je souhaite récupérer toutes les commandes du 17-04-2011.

 SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY");
String myDate = "17-04-2011";
Date date = formatter.parse(myDate);
    Criteria criteria = 
                session.createCriteria(Order.class);
Criterion restrictDate = Restrictions.like("orderDate",date); 

mais ça m'apporte un résultat vide:

23
danny.lesnik

Pourquoi utilisez-vous Restrictions.like(...)?

Vous devez utiliser Restrictions.eq(...).

Notez que vous pouvez également utiliser .le, .lt, .ge, .gt Sur des objets de date comme opérateurs de comparaison. L'opérateur LIKE n'est pas approprié dans ce cas car LIKE est utile lorsque vous souhaitez faire correspondre les résultats en fonction du contenu partiel d'une colonne. Veuillez voir http://www.sql-tutorial.net/SQL-LIKE.asp pour la référence.

Par exemple, si vous avez une colonne de nom avec le nom complet de certaines personnes, vous pouvez faire where name like 'robert %' Pour renvoyer toutes les entrées dont le nom commence par 'robert ' (% Peut remplacer n'importe quelle personnage).

Dans votre cas, vous connaissez le contenu complet de la date à laquelle vous essayez de faire correspondre, vous ne devez donc pas utiliser LIKE mais l'égalité. Je suppose qu'Hibernate ne vous donne aucune exception dans ce cas, mais de toute façon vous aurez probablement le même problème avec la Restrictions.eq(...).

Votre objet de date que vous avez obtenu avec le code:

SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY");
String myDate = "17-04-2011";
Date date = formatter.parse(myDate);

Cet objet date est égal au 17-04-2011 à 0h, 0 minute, 0 seconde et 0 nanoseconde.

Cela signifie que vos entrées dans la base de données doivent avoir exactement cette date. Ce que je veux dire, c'est que si votre entrée de base de données a une date "17-avril-2011 19: 20: 23.707000000", alors elle ne sera pas récupérée parce que vous demandez simplement cette date: "17-avril-2011 00:00: 00.0000000000 ".

Si vous souhaitez récupérer toutes les entrées de votre base de données d'un jour donné, vous devrez utiliser le code suivant:

    SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY");
    String myDate = "17-04-2011";
    // Create date 17-04-2011 - 00h00
    Date minDate = formatter.parse(myDate);
    // Create date 18-04-2011 - 00h00 
    // -> We take the 1st date and add it 1 day in millisecond thanks to a useful and not so known class
    Date maxDate = new Date(minDate.getTime() + TimeUnit.DAYS.toMillis(1));
    Conjunction and = Restrictions.conjunction();
    // The order date must be >= 17-04-2011 - 00h00
    and.add( Restrictions.ge("orderDate", minDate) );
    // And the order date must be < 18-04-2011 - 00h00
    and.add( Restrictions.lt("orderDate", maxDate) ); 
47
Sebastien Lorber

En utilisant cette méthode, vous pouvez obtenir la liste des enregistrements sélectionnés.

GregorianCalendar gregorianCalendar = new GregorianCalendar();
Criteria cri = session.createCriteria(ProjectActivities.class);
cri.add(Restrictions.ge("EffectiveFrom", gregorianCalendar.getTime()));
List list = cri.list();

Tous les enregistrements seront générés dans une liste qui sont supérieurs ou égaux à '08 -Oct-2012 'ou bien passent la date de la date d'acceptation par l'utilisateur au 2ème paramètre de restrictions (gregorianCalendar.getTime()) des critères pour obtenir le enregistrements.

5
pudaykiran

Si la colonne est un horodatage, vous pouvez effectuer les opérations suivantes:

        if(fromDate!=null){
            criteria.add(Restrictions.sqlRestriction("TRUNC(COLUMN) >= TO_DATE('" + dataFrom + "','dd/mm/yyyy')"));
        }
        if(toDate!=null){               
            criteria.add(Restrictions.sqlRestriction("TRUNC(COLUMN) <= TO_DATE('" + dataTo + "','dd/mm/yyyy')"));
        }

        resultDB = criteria.list();
2
Fabius Fusus

essaye ça,

    String dateStr = "17-April-2011 19:20:23.707000000 ";
    Date dateForm = new SimpleDateFormat("dd-MMMM-yyyy HH:mm:ss").parse(dateStr);
    SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");  

    String newDate = format.format(dateForm);  

    Calendar today = Calendar.getInstance();
    Date fromDate = format.parse(newDate);
    today.setTime(fromDate);
    today.add(Calendar.DAY_OF_YEAR, 1);
    Date toDate= new SimpleDateFormat("dd-MM-yyyy").parse(format.format(today.getTime()));

    Criteria crit = sessionFactory.getCurrentSession().createCriteria(Model.class);
    crit.add(Restrictions.ge("dateFieldName", fromDate));
    crit.add(Restrictions.le("dateFieldName", toDate));
    return crit.list();
2
Ajinz