IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JPA Java Discussion :

Requête sur le mois ou l'année d'une date


Sujet :

JPA Java

  1. #1
    Membre actif
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Points : 270
    Points
    270
    Par défaut Requête sur le mois ou l'année d'une date
    Bonjour,

    J'aimerais faire une requête qui permet de filtrer mes enregs selon l'année et le mois d'une date.
    Pour cela j'ai fait la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @NamedQuery(name = "JourFerme.getJourFermeListeForSocieteAndYearMonth", 
    		query = "SELECT jour FROM JourFerme jour WHERE jour.lieu = :lieu AND EXTRACT(YEAR, jour.date) = :annee AND EXTRACT(MONTH, jour.date) = :mois ORDER BY jour.date")
    Mais lors du déploiement sur mon serveur glassfish, j'ai l'erreur suivante :

    cannot Deploy test_erp
    deploy is failing=Error occurred during deployment: Exception while deploying the app [test_erp] : Exception [EclipseLink-28019] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.EntityManagerSetupException
    Exception Description: Deployment of PersistenceUnit [test_erp_PU] failed. Close all factories for this PersistenceUnit.
    Internal Exception: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.JPQLException
    Exception Description: Syntax error parsing [SELECT jour FROM JourFerme jour WHERE jour.lieu = :lieu AND EXTRACT(YEAR, jour.date) = :annee AND EXTRACT(MONTH, jour.date) = :mois ORDER BY jour.date].
    [60, 72] The right expression is not a valid expression.
    [74, 150] The query contains a malformed ending.. Please see server.log for more details.
    NB : J'utilise eclipseLink 2.5

    Merci pour votre aide

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    En SQL standard, il faudrait utiliser YEAR(leChampDate) et MONTH(leChampDate)
    EXTRACT est une fonction propre à MySQL et PostgreSQL... Tu as quoi comme base de données ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre actif
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Points : 270
    Points
    270
    Par défaut
    C'est une SQL Serveur.
    J'ai vu qu'avec eclipselink il fallait utiliser extract() et pas seulement year() ou month()

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    décomposer la date en base pour en extraire le mois et l'année n'est pas très perfrmant, ça ne facilie pas le travail du sgbd pour utiliser les index. Vu que tu veux tout ce qui se trouve dans un mois donné, cela veux dire que tu veux tout ce qui se trouve entre le début et la fin du mois. Refait ta requête dans ce sens, elle sera plus performante, plus facile à écrire, plus souple et indépendante du SGBD.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    @NamedQuery(name = "JourFerme.getJourFermeListeForSocieteInRange", 
    		query = "SELECT jour FROM JourFerme jour WHERE jour.lieu = :lieu AND jour.date >= :minDate and jour.date <= :maxDate ORDER BY jour.date")

  5. #5
    Membre actif
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Points : 270
    Points
    270
    Par défaut
    J'hésitais entre faire une extraction et mettre une date de début et de fin.
    Du coup je vais partir sur la date de début et de fin.

    Merci les gars pour votre aide

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Attention avec la solution de tchize_, si tu as un horodatage, il faudra positionner la partie heure/minute/seconde/milliseconde à 0 pour le début et à 23, 59, 59, 999 pour la fin...
    Personnellement, je choisirais YEAR et MONTH...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Year peut s'en sortir. Month va chier dans la colle sur les index, y a rien à y faire. Si t'as 500 donnée ok, mais quand tu travaille sur des millions de données, tu peux pas te permettre de laisser le sgbd scanner toute la table. pas de besoin de mettre à 59 59 999 sur la fin, suffit de mettre aussi à 0 et de remplacer le <= par un <. Tu peux aussi laisser le sgbd construire la date avec des fonction si tu veux pas t'emmerder avec ça. Le tout c'est d'appliquer les fonction sur tes paramètre et pas sur les colonne de la db.

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    pas de besoin de mettre à 59 59 999 sur la fin, suffit de mettre aussi à 0 et de remplacer le <= par un <.
    Ben non, tu es obligé de mettre 23 59 59 999 sur la fin parce que si tu cibles une ligne correspondant à la date de fin mais contenant par exemple l'heure 10:25:06.102 tu ne l'auras pas dans ton résultat...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Encore une fois non, 31 juillet 2016 10:25:06.102 est bien < 1er aout 2016 00:00:00

  10. #10
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Oui, si tu prends le jour suivant ta date de fin, on est d'accord...
    Mais ce n'est pas ce que tu avais mis dans ton post

    Bref, on chipote mais dans le fond, on peut le faire... c'est tout ce qui compte
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre actif
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Points : 270
    Points
    270
    Par défaut
    J'utilise des dates sans horodatage (org.joda.time.LocalDate), du coup la solution début-fin va bien.

    Merci pour ce complément :-)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment extraire le mois et l'année d'une date?
    Par hazem2410 dans le forum Oracle
    Réponses: 2
    Dernier message: 10/12/2010, 17h03
  2. Réponses: 1
    Dernier message: 19/08/2008, 21h13
  3. Extraire le mois et l'année d'une date
    Par kosni dans le forum Cognos
    Réponses: 3
    Dernier message: 23/05/2008, 15h10
  4. [SQL Server] extraire le mois et l'année d'une date
    Par calison3 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 13/03/2006, 12h16
  5. Récupérer le mois et l'année d'une date
    Par missllyss dans le forum SQL
    Réponses: 2
    Dernier message: 23/09/2003, 09h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo