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

Langage SQL Discussion :

Exploser une période


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 189
    Points : 80
    Points
    80
    Par défaut Exploser une période
    Bonjour à tous,

    J'ai une table (sous mysql) qui se présente ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    idagenda 	dStart 	  dEnd 	          type 	            Ouv_LUNDI 	Ouv_MARDI 	Ouv_MERCREDI 	Ouv_JEUDI 	Ouv_VENDREDI 	Ouv_SAMEDI 	Ouv_DIMANCHE
       110     2014-05-03  2014-05-09 	OUVERTURE_SAUF    	1          0          0          0          0          1          0
    Est'il possible via une requête pour transformer en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    idagenda       date
    110             2014-05-04
    110             2014-05-06
    Si quelqu'un a une piste ...

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    utilisez un union all

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 189
    Points : 80
    Points
    80
    Par défaut
    Heuuuu ... je connais 'union all', mais je ne voie pas du tout comment l'utiliser dans ce cas de figure. Peut tu creuser un peu ton idée ?

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut,
    Allez, un peu d'imagination !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT idagenda, dt 
    FROM (
    SELECT idagenda, dStart dt, 1 pos
    FROM tatable
    UNION ALL
    SELECT idagenda, dEnd dt, 2 pos
    FROM tatable
    ) t
    ORDER BY idagenda, pos

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 189
    Points : 80
    Points
    80
    Par défaut
    C'est un petit peu plus complexe que ça
    Si tu regardes la table, la période va du 03/05 au 09/05 avec une ouverture les lundi et vendredi. De ce faite cela devrait retourner les 04/05 et 06/05.

  6. #6
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Euh, tu l'obtiens comment exactement le 06/05 ?
    Tu obtiens toujours deux lignes ou parfois plus ?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 189
    Points : 80
    Points
    80
    Par défaut
    Date de début de la période le 03/05 : vendredi
    Date de fin de la période le 09/05 : jeudi

    L'objet est disponible le lundi et le samedi, cela nous donne comme date :
    - samedi 04/05
    - lundi 06/05

    Mais je ne sais pas si cela est faisable.

  8. #8
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Si si, tout est possible (ou presque)

    Fais le produit cartésien avec

    (SELECT 0 i UNION ALL
    SELECT 1 UNION ALL
    SELECT 2 UNION ALL
    SELECT 3 UNION ALL
    SELECT 4 UNION ALL
    SELECT 5 UNION ALL
    SELECT 6 UNION ALL)

    => Tu utilises date_add pour ajouter i jours à ta date de début.
    => Tu utilises weekday sur le résultats pour savoir si ça tombe sur un lundi... dimanche.
    => Tu testes avec un gros CASE WHEN si le flag correspondant est à 1 (c'est ton filtre)

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 189
    Points : 80
    Points
    80
    Par défaut
    Lorsque tu utilises :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (SELECT 0 i UNION ALL
    SELECT 1 UNION ALL
    SELECT 2 UNION ALL
    SELECT 3 UNION ALL
    SELECT 4 UNION ALL
    SELECT 5 UNION ALL
    SELECT 6 UNION ALL)
    Je présume que cela représente la durée en jour de la période ?

    J'ai simplifié l'exemple, il pourrait y avoir des enregistrements du type :
    Un marché qui a lieu du 01/01/2000 au 31/12/2012, tous les lundi et jeudi, dans ce cas la il faudrait pouvoir boucler sur le nombre de jour.... je ne sais pas si je m'exprime correctement

  10. #10
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Oui effectivement, dans ce cas, le mieux serait d'avoir une table calendrier qui contient tous les jours de l'année (ce type de table peut être utile par ailleurs, par exemple pour définir les jours ouvrés, ...). Du coup, tu fais la jointure sur calendrier.date between dstart and dend, et tu n'as plus besoin de faire dstart + i jours.

  11. #11
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Je penses que l'on peut se passer d'une table de calendrier.

    Pour une date de début on a 2 possibilités :

    Soit la date de début tombe sur un jour ouvré => pas de problème.

    Soit non :
    - extraction du numéro de jour de la semaine de la date de début appelé N
    - Si le 1er numéro de jour de la semaine ouvré (appelé M) est strictement inférieur à N alors il faut rajouter : (7 -N) + M à la date de début
    - Si le 1er numéro de jour de la semaine ouvré (appelé M) est strictement supérieur à N alors il faut rajouter : M - N à la date de début


    (Y a peut etre un -1 à coller, j'ai pas testé plus que ça)


    Tout ceci doit être faisable avec une structure case when..un peu complex ok

  12. #12
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Moi ce que j'ai compris, c'est qu'il faut sortir éventuellement 2 lignes par semaine, le nombre de semaines étant dynamique.

    En Oracle, je te génère ça à la volée.
    Sous MySQL, je sais pas si on sait faire... d'où la table calendrier.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 189
    Points : 80
    Points
    80
    Par défaut
    Merci pour de vous intérésser à mon problème.
    Le nombre de semaine est bien dynamique ( l'année également ), ainsi que le nombre de jour activer (=1). Dans un exemple plus concret, si la date de debut est le 01/01, la date de fin est le 31/12 et que le lundi est à 1. Alors la requête devra me sortir les dates du lundi des 52 semaines.

    punkoff : je connais les requêtes "de base", mais je ne voie pas comment transcrire ta procédure sans table intermédiaire

  14. #14
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    ah ok, non effectivement la pas trop le choix, j'étais resté sur l'idée de ne sortir que la 1ere date de début et la dernière...

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/10/2006, 01h19
  2. Création d'une période
    Par Poisson59 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/10/2006, 10h34
  3. [VBA-A] calcul du total des heures d'une période
    Par aibar dans le forum VBA Access
    Réponses: 2
    Dernier message: 11/06/2006, 00h16
  4. Retourner toutes les dates d'une période
    Par Gwipi dans le forum Requêtes
    Réponses: 2
    Dernier message: 27/03/2006, 23h44
  5. [CR] Filtrer pour une période donnée
    Par liberio dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 21/04/2004, 16h32

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