[SQL] Intervalle de dates

Youpi ! Bonjour à vous toutes et à vous tous.
Vous allez bien, Vesooooooooul ? Faisez du bruit, Limoooooooooges !

C'est encore Jean-Guy qui vient vous ennuyer avec un problème lié au SQL.
Comme d'habitude, un porte-clés en granit et douze caniches abricot sont à la clé.

J'ai créé une nouvelle table "dates_livraison" contenant cinq champs.

dates_livraison (id_voiture, annee, mois, jour, garage)

J'y ai inséré une centaine de n-uplets, avec le même identifiant de voiture, pour les mois de juin, juillet et août. Dans mon code en PHP, je souhaiterais récupérer le(s) garage(s) où a/ont été livré(s) cette voiture, entre le 14 juin et le 20 juillet.

SELECT garage FROM 'dates_livraison' WHERE (jour BETWEEN '14' AND '20') AND (mois BETWEEN '6' AND '7') AND (annee BETWEEN '2010' AND '2010') AND id_voiture='1';


Avec BETWEEN, j'obtiens les n-uplets du 14 juin au 20 juin, puis du 14 juillet au 20 juillet. Ce n'est vraiment pas terrible, n'est-ce pas ? ha ha.

Auriez-vous une solution ? Merci d'avance.

Jean-Guy Badiane, kinésithérapeute pour chariots usagés.



--
Le saumon, ça voyage mal dans le mocassin.

4 réponses

  • Votes
  • Date
  • Date décroissante
  1. Faudrait convertir tes valeurs au format date

    Essaye un truc du genre :
    SELECT garage FROM 'dates_livraison' WHERE ( (ISDATE('jour/mois/annee') AS "DD/MM/YYYY") BETWEEN '14/06/2010' AND '20/07/2010') AND id_voiture='1';
    1. salut

      Faster than PsyTron, la soluce SQL standard est de concaténer année avec mois et jour (en s'assurant que les 0 initiaux sont présents) et le tour est joué !
      si t'es pas sûr d'avoir des 0 initiaux, il faut un décalage décimal

      select garage from dates_livraisons where annee||mois||jour between '20100614' and '20100720' and ...

      avec les décalages:
      select garage from dates_livraisons where annee*10000+mois*100+jour between 20100614 and 20100720 and ...

      idéalement, il faut stocker des dates dans les bases, pas autre chose. reste ensuite à apprendre à les manipuler, c'est l'histoire d'un petit quart d'heure.
      1. Merci beaucoup, c'est exactement ce qu'il me fallait.

        Retrouvez-moi dans votre supermarché, je vous fournirai les cadeaux susnommés, ainsi que quelques bons de réduction sur le rayon Fromages.

        A bientôt sur CCM.
        Le saumon, ça voyage mal dans le mocassin.
        1. Hello à toutes et à tous. Jean-Guy, en tongs et paréo.

          Votre aide m'a été TRÈS précieuse, et je vous en remercie.
          Auriez-vous la gentillesse de répondre à une dernière question ?

          En fait, cela concerne cette requête...
          select garage from dates_livraisons where annee*10000+mois*100+jour between 20100614 and 20100720 and ...  


          J'ai rajouté dans ma table une colonne "TEST". Elle a pour valeur O ou N.
          dates_livraison (id_voiture, annee, mois, jour, garage, test)

          Ce que je souhaiterais, c'est vérifier si les n-uplets (entre le 14 juin et le 20 juillet 2010) ont tous la valeur TEST égale à O. Savez-vous comment procéder ? Merci d'avance.

          Jean-Guy Badiane, disponible en taille Medium et Small.
          1. arg. après huit heures de recherche, je n'ai toujours rien trouvé...

            Je remonte le message.