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 :

Calcul date : calculer le nombre d'heure ouvrés entre 2 dates


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Responsable de trafic
    Inscrit en
    Septembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Responsable de trafic
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2017
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Calcul date : calculer le nombre d'heure ouvrés entre 2 dates
    Bonjour,
    Après de vaines recherche sur le forum je me permet d'exposer mon problème.
    Je dispose d'une table avec 3 colonnes : ID, Date_Debut, Date_Fin (extrait ci-dessous)
    Je souhaite faire une vue qui me donne la somme du nombre de minutes ouvrés (Entre 07:00 et 18:00) entre ces deux dates. Il faut donc que j'enlève les samedi, dimanche et jours férié (je dispose d'une table avec les jours férié) et que j'enlève les heures entre 18:00 et 07:00
    Je travail avec SQL Developer.

    Je pense qu'il faut que je fasse un SUM et que pour chaque ligne je soustrait le (nombre de samedi et dimanche)*24*60 entre les deux dates et que je soustrait le (nombre d'heures entre 18:00 et 07:00)*60 et que je soustrait le (nombre de jour férié hors samedi et dimanche)*24*60

    Je souhaite au maximum éviter d'avoir a créer une VUE intermédiaire.

    Le résultat sera une VUE avec une colonne ID, Minute

    ID Date_Debut Date_Fin
    19 29/08/2016 09:00 29/08/2016 16:00
    19 05/09/2016 09:00 05/09/2016 16:00
    25 10/01/2016 09:00 19/01/2016 17:00
    19 15/03/2016 08:00 15/03/2016 18:00
    43 31/10/2016 08:00 18/11/2016 13:00
    25 22/02/2016 08:00 08/03/2016 16:30
    19 07/03/2016 13:30 07/03/2016 16:30
    23 14/03/2016 09:00 29/04/2016 16:30
    19 06/04/2016 09:30 06/04/2016 10:30
    23 25/04/2016 08:00 27/04/2016 17:00
    23 29/04/2016 08:00 29/04/2016 14:00
    43 20/06/2016 09:00 01/07/2016 18:00
    19 23/06/2016 15:00 23/06/2016 16:30
    19 04/07/2016 09:00 27/08/2016 16:30
    25 30/08/2016 07:00 30/08/2016 10:00
    19 06/09/2016 09:00 06/09/2016 11:00
    19 16/09/2016 09:00 16/09/2016 12:00
    19 20/09/2016 14:30 20/09/2016 16:30
    22 05/10/2016 09:00 23/11/2016 11:00
    24 18/10/2016 08:30 18/10/2016 14:30
    19 10/11/2016 09:00 10/11/2016 12:00
    25 14/11/2016 08:00 14/11/2016 16:00
    41 14/11/2016 13:00 14/11/2016 17:00
    19 03/12/2016 06:00 05/12/2016 21:00

    Merci de l'aide que vous m'apporterez.

    rthierry76

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    si vous en êtes encore à la phase de conception, ce serait beaucoup plus simple avec une seule table qui comprend autant de lignes que de dates avec un attribut jour ouvrable et un attribut jour ouvré.
    Ensuite il suffit de compter le nombre de jours ouvrés entre deux bornes et de multiplier par le nombre d'heures qui est fixe d'après votre énoncé (9 fois 60 minutes par jour, soit 540 minutes)

    Sinon créez une table calendrier avec l'attribut ouvré (O/N) et faite une jointure, ex :

    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
    [with tcalend (TCdte, TCouv) as
        (select '2018-01-01', 'N' 
         union all                
         select '2018-01-02', 'O' 
         union all                
         select '2018-01-03', 'O' 
         union all                
         select '2018-01-04', 'O' 
         union all                
         select '2018-01-05', 'O' 
         union all                
         select '2018-01-06', 'N' 
         union all                
         select '2018-01-07', 'N' 
         union all                
         select '2018-01-08', 'O' 
         union all                
         select '2018-01-09', 'O' 
         union all                
         select '2018-01-10', 'O'
         union all               
         select '2018-01-11', 'O'
         union all               
         select '2018-01-12', 'O'
         union all               
         select '2018-01-13', 'N'
         union all               
         select '2018-01-14', 'N'
         union all               
         select '2018-01-15', 'O'
         union all               
         select '2018-01-16', 'O'
        )                        
       , tperiod (TPdeb, TPfin) as        
        (select '2018-01-01', '2018-01-10'
    select count(*)                       
         , count(*) * 540 as MINUTES      
    from  tcalend Tc                      
    inner join tperiod TP                 
       ON TC.TCdte >= TPdeb               
      and TC.TCdte <= TPfin               
    where TC.TCouv ='O'                   
     
    ==>  7        3780

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Si SQL Developer ça veut dire Oracle, j'avais fait une fonction similaire qui s'appuie sur la table calendrier proposée par Waldar :
    Intervalle entre deux dates en secondes
    Calendrier avec jours fériés

    Ça doit pouvoir se simplifier, mais il y a quand même quelques cas particuliers à traiter.

  4. #4
    Candidat au Club
    Homme Profil pro
    Responsable de trafic
    Inscrit en
    Septembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Responsable de trafic
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2017
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bonjour,
    merci pour vos réponses. je teste ça rapidement.

    rthierry76

  5. #5
    Candidat au Club
    Homme Profil pro
    Responsable de trafic
    Inscrit en
    Septembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Responsable de trafic
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2017
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bonjour,
    J'ai abandonné, je vais le faire manuellement.
    J'ai qu'une trentaine de ligne par an

    Merci pour tout.

    rthierry76

Discussions similaires

  1. Réponses: 12
    Dernier message: 12/12/2023, 19h54
  2. Réponses: 1
    Dernier message: 21/03/2018, 13h00
  3. [AC-2013] Nombre d'heures ouvrés entre deux dates - liste d'exception
    Par leopaul36 dans le forum Access
    Réponses: 1
    Dernier message: 30/07/2015, 17h52
  4. [Dates] Calcul du nombre de jours ouvrés entre 2 dates
    Par Pokerstar dans le forum Langage
    Réponses: 6
    Dernier message: 16/07/2011, 16h02
  5. Réponses: 1
    Dernier message: 10/08/2006, 14h43

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