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

PHP & Base de données Discussion :

Requête avec des dates [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut Requête avec des dates
    Bonjour à tous,

    Je dois faire une requête sur des tables d'un système qui sont structuré de tel manière, je simplifie :

    Article :
    Id Article

    Tarifs :
    Article
    Tarif
    Date début
    Date fin

    Un article a donc plusieurs lignes tarifs.
    Mais un seul s'applique celui qui s'applique en fonction de la date du jour.

    Par exemple pour l'article B1 j'ai :
    B1;15,10;01/08/2010;31/08/2010
    B1;15,40;01/09/2010;01/01/1753

    Cela signifie que pour le mois d'aout le tarif du produit B1 est de 15.10€ et qu'a partir du 1er septembre (sans date de fin définie pour le moment) le tarif est de 15,40€

    Je souhaite donc faire une requête pour récupérer le tarif en vigueur mais je ne vois pas comment faire...

    Merci d'avance de votre aide.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT tarif FROM tarifs WHERE Article = 12345
    AND CURDATE() BETWEEN date_debut AND date_fin
    Attention de ne pas avoir de chevauchements de plage.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut
    Merci de ta réponse.

    Cela fonctionnera-il le 3 septembre par exemple ? (la date de fin sera 01/01/1753)

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ca ne fonctionne pas avec des dates fantaisistes.

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut
    Et oui et c'est bien là mon problème...
    Car en fait cette date est généré automatiquement par un logiciel si je n'ai pas renseigné de date de fin et je n'ai pas moyen de modifier cette action.

    Moi je récupère ces infos de SQL Server et les injectes dans ma table MySQL.

    Peux être qu'après mon load data infile je pourrais lancer une requête pour faire un UPDATE de ce champ avec la date du jour ? C'est peut être le meilleur moyen ? Qu'en pensez-vous ?

    Merci de ton aide

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ca serait plus propre de corriger la donnée ; en mettant NULL par exemple.
    Mais on peut aussi le traiter tel quel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT tarif FROM tarifs WHERE Article = 12345
    AND CURDATE() BETWEEN date_debut AND date_fin
    OR CURDATE() > date_debut AND date_fin = '1753-1-1'

  7. #7
    Membre confirmé
    Avatar de tse_jc
    Homme Profil pro
    Data Solutions
    Inscrit en
    Août 2010
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Data Solutions
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 287
    Points : 597
    Points
    597
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Pour te mettre sur la voie, suffit de trouver un bon algo qui fonctionne sans prendre en compte la date de fin.
    Bien que la structure db soit mal foutue et le mot est faible car elle autorise les doublons sur les tarifs (d'après les infos que tu nous as donné), ce qui implique une vérification de non existence de doublons de tarifs par l'appli, on va partir du principe que cette vérification est faite et bien faite.

    Donc pour ton algo, en partant du principe donc, qu'il ne peut y avoir deux tarifs différents en vigeur en même temps et que visiblement la mise à jour des tarifs se fait tous les premiers du mois on peut faire un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT tarif FROM tarifs WHERE Article = 12345
    AND to_days(now())-to_days(date_debut)<=31
    Ce qui devrait être plus rapide que les requêtes qui ont été proposés en réponse.

    Faudra juste rajouter une vérification sur le mois pour le mois de février ou le prendre en compte dans la partie php avec un if.

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ce qui devrait être plus rapide que les requêtes qui ont été proposés en réponse.
    Les deux requêtes ne font pas la même chose, en particulier tu considères que le debut est toujours le 1 et tu ignores la date de fin.

    Je ne suis d'ailleurs pas convaincu par ta requête :
    - pourquoi ne pas utiliser datediff ?
    - est-ce qu'un calcul to_days n'est pas justement plus long qu'une simple comparaison ?
    - il manque une condition pour ne pas avoir les dates passées.

  9. #9
    Membre confirmé
    Avatar de tse_jc
    Homme Profil pro
    Data Solutions
    Inscrit en
    Août 2010
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Data Solutions
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 287
    Points : 597
    Points
    597
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    Excuse moi si j'ai été un peu confus dans mon explication, mais 70h de boulot par semaine ca aide pas.

    L'Algorithme est basé sur le fait qu'il n'y a qu'une mise à jour par mois (EDIT: et qu'elle est toujours faite) et qu'il n'y a pas de doublons de tarifs sur une période donnée. A partir de là, la requête retournera systèmatiquement qu'un seul enregistrement.

    Sur de gros enregistrements deux comparaisons seront toujours plus longues qu'une seule même basée sur une fonction interne et donc optimisée de surcroit.

    EDIT : Pourquoi ne pas utiliser DATEDIFF? Tout simplement car comparer deux dates necessite de le faire sur l'année, le mois et le jour (ce que fait la fonction en interne) or je n'ai besoin de comparer que sur les jours (tout en prenant en compte le mois et l'année malgré tout). Donc To_Days est plus rapide. DATEDIFF est très bien mais pas opti pour ma solution.

  10. #10
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 261
    Points : 69
    Points
    69
    Par défaut
    Merci pour vos réponses.

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

Discussions similaires

  1. Requête avec des dates
    Par Daviloppeur dans le forum Requêtes
    Réponses: 3
    Dernier message: 28/05/2010, 12h28
  2. VB + Excel + SQL + Soucis requête avec des dates
    Par Invité dans le forum Excel
    Réponses: 2
    Dernier message: 12/03/2009, 08h15
  3. Requête avec des dates
    Par Danielle80 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 04/11/2007, 12h57
  4. requête avec des dates
    Par brigdid dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 28/06/2007, 09h22
  5. SQL Requête avec des dates
    Par dahu29 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/03/2006, 18h20

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