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

Requêtes MySQL Discussion :

Opérateurs de comparaison avec les dates


Sujet :

Requêtes MySQL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Par défaut Opérateurs de comparaison avec les dates
    Bonjour à tous,

    Je ne comprend pas comment les opérateurs de comparaison fonctionnent avec les champs de date.

    Dans une interface web, je souhaite que l'utilisateur puisse exécuter une recherche sur des paiements en fonction de leur date; un premier menu déroulant permet de sélectionner un opérateur parmi = < <= > >= !=
    3 autres menus permettent de choisir l'année, le mois, le jour, avec la possibilité d'insérer un blanc.

    Les recherches se feraient donc selon des critères comme

    = 2007 pour les paiements de toute une année
    = 2007-12 pour ceux d'un mois
    = 2007-12-01 pour ceux correspondants précisément à une date.

    ce qui me semble assez intuitif pour l'utilisateur, mais pas transposable directement en une requête SQL.

    En effet, je constate que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id FROM paiements WHERE date (opérateur) '2008-12-01'
    fonctionne de manière attendue avec les opérateurs = != < <= > >=, mais que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id FROM paiements WHERE date (opérateur) '2007'
    ne renvoie rien avec =
    renvoie tout avec !=
    renvoie tous les paiements jusque 2006 avec < et <=
    renvoie les paiements de 2007 et 2008 avec > et >=

    Le comportement est semblable pour une comparaison avec '2007-12'

    Pourrait-on m'expliquer la logique de ce comportement ?

    Merci d'avance,

    G.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Par défaut Toujours ces opérateurs...
    C'est encore moi...

    Pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    mysql> SELECT id, date FROM paiements WHERE date > '2007-1-1'  ORDER BY date DESC;
    +------+------------+
    | id   | date       |
    +------+------------+
    | 1121 | 2048-04-06 | 
    | 3879 | 2048-04-06 | 
    | 2457 | 2014-03-04 | 
    | 2745 | 2009-08-18 | 
    | 6326 | 2008-01-10 | 
    | 2432 | 2007-12-24 | 
    +------+------------+
    6 rows in set (0.02 sec)
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    mysql> SELECT id, date FROM paiements WHERE date > '2007-O1-01'  ORDER BY date DESC;
    +------+------------+
    | id   | date       |
    +------+------------+
    | 1121 | 2048-04-06 | 
    | 3879 | 2048-04-06 | 
    | 2457 | 2014-03-04 | 
    | 2745 | 2009-08-18 | 
    | 6326 | 2008-01-10 | 
    +------+------------+
    5 rows in set, 1 warning (0.01 sec)
    ne donnent-ils pas les mêmes résultats ?

    Et comment connaître le 'warning' dont il est question dans le deuxième cas ?

  3. #3
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Par défaut
    Citation Envoyé par gvdmoort Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id FROM paiements WHERE date (opérateur) '2007'
    ne renvoie rien avec =
    renvoie tout avec !=
    renvoie tous les paiements jusque 2006 avec < et <=
    renvoie les paiements de 2007 et 2008 avec > et >=

    Le comportement est semblable pour une comparaison avec '2007-12'

    Pourrait-on m'expliquer la logique de ce comportement ?

    Merci d'avance,

    G.
    '2007' n'est pas une date, et '2007-12' non plus.

    Tu peux faire des choses comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT id FROM paiements WHERE YEAR(date) (opérateur) '2007' ;
    SELECT id FROM paiements WHERE DATE_FOMAT(date, '%Y:%m') (opérateur) '2007';

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Par défaut
    Citation Envoyé par gvdmoort Voir le message
    C'est encore moi...

    Pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql> SELECT id, date FROM paiements WHERE date > '2007-1-1'  ORDER BY date DESC;
    et

    [CODE]mysql> SELECT id, date FROM paiements WHERE date > '2007-O1-01' ORDER BY date DESC;

    ne donnent-ils pas les mêmes résultats ?
    La comparaison est textuelle. Donc '11' et '12' sont bien supérieurs à '02', mais inférieurs à '2'... C'est la raison pour laquelle il faut toujours utiliser le format ISO 'YYYY-MM-DD'.
    Ensuite, dans ta seconde requête, tu écris '2007-O1-01' au lieu de '2007-01-01' (o majuscule au lieu de zéro).
    Citation Envoyé par gvdmoort Voir le message
    Et comment connaître le 'warning' dont il est question dans le deuxième cas ?
    en faisant ceci juste après ta requête :

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Par défaut
    Quant à ma seconde question, j'ai trouvé la réponse, j'avais tapé un O à la place d'un 0

    Citation Envoyé par Antoun Voir le message
    '2007' n'est pas une date, et '2007-12' non plus.

    Tu peux faire des choses comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT id FROM paiements WHERE YEAR(date) (opérateur) '2007' ;
    SELECT id FROM paiements WHERE DATE_FOMAT(date, '%Y:%m') (opérateur) '2007';
    Je crois comprendre que ta deuxième proposition doit en fait être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT id FROM paiements WHERE DATE_FORMAT(date, '%Y:%m') (opérateur) '2007:12';
    2007:12 serait-il une date valide et pas 2007-12 ?

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Par défaut
    Citation Envoyé par gvdmoort Voir le message
    Je crois comprendre que ta deuxième proposition doit en fait être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT id FROM paiements WHERE DATE_FORMAT(date, '%Y:%m') (opérateur) '2007:12';
    yep ! désolé !
    Citation Envoyé par gvdmoort Voir le message
    2007:12 serait-il une date valide et pas 2007-12 ?
    Non. Une date comporte une année, un mois et un jour...

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

Discussions similaires

  1. Comparaison avec les dates
    Par delavega dans le forum ASP
    Réponses: 3
    Dernier message: 29/05/2007, 11h07
  2. Help!! Probleme avec les dates sur SQL SERVER
    Par Nadaa dans le forum MS SQL Server
    Réponses: 16
    Dernier message: 03/08/2006, 16h55
  3. [SQL] problème avec les date et les group By
    Par Stef784ever dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/11/2004, 09h18
  4. Pb avec les dates < année 2000
    Par elitost dans le forum Oracle
    Réponses: 2
    Dernier message: 15/09/2004, 12h37
  5. Interbase - dbExpress -> problème avec les dates
    Par marghett dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/07/2004, 03h55

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