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

Développement SQL Server Discussion :

Regroupement de plages horaires


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 34
    Points : 30
    Points
    30
    Par défaut Regroupement de plages horaires
    Bonjour,
    Je cherche un moyen de regrouper des plages horaires pour une date donnée.
    Par exemple deux palges 08:00-10:00 et 10:00-12:00 en une seule plage 08:00-12:00

    Dans un premier temps j'ai utilisé un curseur, mais je cherche d'autres solutions.
    Pour l'instant j'en suis ici, mais cela ne marche pas pour certains regroupements:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    DECLARE @ActivitePlage AS TABLE(
        DateActivite    date,
        Activite        varchar(128),
        Debut            time(0),
        Fin                time(0)
    )
     
    INSERT INTO @ActivitePlage VALUES ('2015-05-04', 'Travail'    , '08:00:00', '10:00:00')
    INSERT INTO @ActivitePlage VALUES ('2015-05-04', 'Travail'    , '10:00:00', '12:00:00')
    INSERT INTO @ActivitePlage VALUES ('2015-05-04', 'Repas'     , '12:00:00', '14:00:00')
    INSERT INTO @ActivitePlage VALUES ('2015-05-04', 'Conge'     , '14:00:00', '17:00:00')
    INSERT INTO @ActivitePlage VALUES ('2015-05-05', 'Travail'    , '08:00:00', '12:00:00')
    INSERT INTO @ActivitePlage VALUES ('2015-05-05', 'Repas'     , '12:00:00', '14:00:00')
    INSERT INTO @ActivitePlage VALUES ('2015-05-05', 'Travail'    , '14:00:00', '17:00:00')
    INSERT INTO @ActivitePlage VALUES ('2015-05-06', 'Travail'    , '08:00:00', '09:00:00')
    INSERT INTO @ActivitePlage VALUES ('2015-05-06', 'RTT'        , '09:00:00', '10:00:00')
    INSERT INTO @ActivitePlage VALUES ('2015-05-06', 'Travail'    , '10:00:00', '12:00:00')
    INSERT INTO @ActivitePlage VALUES ('2015-05-06', 'Conge'    , '12:00:00', '14:00:00')
    INSERT INTO @ActivitePlage VALUES ('2015-05-06', 'Conge'    , '14:00:00', '17:00:00')
    INSERT INTO @ActivitePlage VALUES ('2015-05-07', 'Travail'    , '08:00:00', '12:00:00')
    INSERT INTO @ActivitePlage VALUES ('2015-05-07', 'RTT'        , '12:00:00', '14:00:00')
    INSERT INTO @ActivitePlage VALUES ('2015-05-07', 'RTT'        , '14:00:00', '17:00:00')
    INSERT INTO @ActivitePlage VALUES ('2015-05-08', 'Conge'    , '08:00:00', '12:00:00')
    INSERT INTO @ActivitePlage VALUES ('2015-05-08', 'Travail'    , '12:00:00', '14:00:00')
    INSERT INTO @ActivitePlage VALUES ('2015-05-08', 'Conge'    , '14:00:00', '17:00:00')
    INSERT INTO @ActivitePlage VALUES ('2015-05-09', 'Repos'    , NULL,NULL)
    INSERT INTO @ActivitePlage VALUES ('2015-05-09', 'Repos'    , NULL,NULL)
    INSERT INTO @ActivitePlage VALUES ('2015-05-09', 'Repos'    , NULL,NULL)
    INSERT INTO @ActivitePlage VALUES ('2015-05-10', 'Repos'    , NULL,NULL)
    INSERT INTO @ActivitePlage VALUES ('2015-05-10', 'Repos'    , NULL,NULL)
    INSERT INTO @ActivitePlage VALUES ('2015-05-10', 'Repos'    , NULL,NULL)
     
    SELECT DISTINCT 
        DateActivite1,
        -- Selection dans les plages regroupées de l'heure de debut au plus tot
        (CASE 
            WHEN AAA.Fin1 between AAA.Debut2 AND AAA.Fin2 AND AAA.Debut2 < AAA.Debut1  THEN AAA.Debut2 
            ELSE AAA.Debut1
        END) AS Debut,
        -- Selection dans les plages regroupées de l'heure de fin au plus tard
        (CASE 
            WHEN AAA.Fin1 < AAA.Fin2 AND AAA.Debut2 Between AAA.Debut1 AND Fin1 THEN AAA.Fin2 
            ELSE AAA.Fin1
        END) AS Fin
    FROM 
    (SELECT DISTINCT 
        AA1.DateActivite    AS DateActivite1,
        AA1.Debut            AS Debut1,
        AA1.Fin                AS Fin1,
        AA2.DateActivite    AS DateActivite2,
        AA2.Debut            AS Debut2,
        AA2.Fin                AS Fin2
    FROM 
        -- Toutes les plages d absences
        (SELECT DateActivite, Debut, Fin FROM @ActivitePlage WHERE Activite = 'RTT' OR Activite='Conge') AA1 
        FULL JOIN
        -- Ces plages sont jointes avec les plages pouvant etre regroupées
        (SELECT DISTINCT A1.DateActivite, A1.Debut, A2.Fin
        FROM 
            (SELECT DateActivite, Debut, Fin FROM @ActivitePlage WHERE Activite = 'RTT' OR Activite='Conge') AS A1
            JOIN
            (SELECT DateActivite, Debut, Fin FROM @ActivitePlage WHERE Activite = 'RTT' OR Activite='Conge') AS A2 
            ON A1.Fin = A2.Debut AND A1.DateActivite = A2.DateActivite) AA2
    ON AA1.DateActivite = AA2.DateActivite) AAA
    Cdt.

    Goulven

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 34
    Points : 30
    Points
    30
    Par défaut
    Je viens de trouver la solution ici:
    http://blog.developpez.com/philben/p...es#comment-323

    Cdt.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Gouxosor Voir le message
    Je viens de trouver la solution ici:
    http://blog.developpez.com/philben/p...es#comment-323

    Cdt.

    Il existe de nombreuses solutions, toutes différentes au niveau des performances...

    J'ai écrit un article à ce sujet : http://blog.developpez.com/sqlpro/p9...alles_en_sql_1

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Mars 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 34
    Points : 30
    Points
    30
    Par défaut
    Merci SQLpro, je vais regarder, surtout que les solutions ont des tests de temps de calcul.
    (J'ai écrit "la solution", parce que je comptais m'en satisfaire pour l'instant.)

    Cdt.
    .

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

Discussions similaires

  1. Gestion de plages horaires
    Par Galaad dans le forum ASP
    Réponses: 3
    Dernier message: 24/01/2007, 13h14
  2. calcul délais entre deux dates avec plages horaires
    Par leila eco dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 03/01/2007, 17h51
  3. Regroupement par plage de données consécutives.
    Par ntexcier dans le forum Administration
    Réponses: 5
    Dernier message: 06/11/2006, 09h29
  4. [debutant] intersection de deux plages horaires
    Par absolut75 dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 24/05/2006, 14h03
  5. [SQL2005] plages horaires
    Par The_badger_man dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/05/2006, 13h30

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