[SQL] intervalle de date

Spiloack -  
 Jacques -
Bonjour à tous, j'aimerai récupérer un intervalle de date via une requête SQL sur une base oracle. Mais j'aimerais trouver un intervalle compté en jour "ouvrés", c'est à dire sans compter les week-end et les jours feriés.

Merci d'avance...

Spiloack.
Configuration: Base oracle

2 réponses

  1. crabs Messages postés 909 Statut Membre 507
     
    Salut,
    J'ai eu le même problème, mais il fallait que je détermine le nombre d'heure
    ouvrée (gestion de la disponibilité d'un système d'information). Gros soucis,
    car en France, au US ou en belgique, les jours fériés ne sont pas les mêmes...

    Impossible de la faire par le biais d'une simple requète. Il faut passer par de
    la programmation avec une table qui va contenir le nombre de jour que
    compte un jour : un jour ouvert compte pour 1 jour, un samedi ou un
    dimanche ou un jour férié compte pour 0.

    Ensuite soit par le biais de ton programme, soit par le biais d'une procédure,
    ta fonction fait la somme des jours par le biais de cette table en faisant une
    restriction sur la date (champ clé de ta table) soit un truc du genre :
    SELECT SUM(jour) FROM jour_a_compter
       WHERE date >= '[debut]' AND date <= '[fin]'
    

    Maintenant si tu regardes bien, ta table aura 365 enregistrements par an, ce
    qui n'est pas énorme, moins de 37000 lignes pour un siécle directement
    indexé sur seul le critère de recherche...

    L'avantage d'une table de ce type c'est qu'on n'a pas de truc complexe à gérer
    du type 'et si le jour férié tombe un dimanche...'.

    Comme t'as l'air d'être sous oracle, tu devrais pouvoir coder ça dans une
    procédure et mettre le résultat du calcul dans tes tables. Ensuite t'as plus
    qu'a 'trigger' quand il y a modification la date de début ou de la date de fin
    pour refaire le calcul.
    [je présume peut-être des capacités d'ORACLE, mais je n'ai eu l'occasion que
    de le cotoyer lors de présentations technico-commerciales]

    A+, crabs
    2
    1. Spiloack
       
      Ok, j'ai compris ce qu'il me reste à faire... ;o) Merci pour ta réponse !

      Spiloack.
      0
    2. Jacques
       
      Bonjour,
      Peut-être que ce code VB est adaptable à votre problématique ?
      A vous de voir


      'comment compter un nbre de jours entre 2 dates saisies ds 2 cellules en
      'otant les samedi,dimanche et jours feries

      Function NbOuvrés&(D1, D2)
      Dim Prem As Date, Der As Date, i As Date
      If D1 = D2 Then
      Prem = D1
      If TYPEJOUR(Prem) = 0 Then NbOuvrés = 1
      Exit Function
      End If
      Select Case D1 < D2
      Case True: Prem = D1: Der = D2
      Case False: Prem = D2: Der = D1
      End Select
      For i = Prem To Der
      NbOuvrés = NbOuvrés + (TYPEJOUR(i) = 0) * -1
      Next i
      End Function


      'Cette fonction renvoie 0 si le jour passé en paramètre est un jour de semaine,
      '1 s'il s'agit d'un samedi ou d'un dimanche et 2 s'il s'agit d'un jour férié.
      'Valide jusqu'en 2099 et pour les jours fériés français
      Function TYPEJOUR(D As Date)
      'L. Longre
      Dim A As Integer, T As Integer
      Dim LP As Date, LD As Long
      Dim Toto As Long

      A = Year(D)
      If A > 2099 Then
      TYPEJOUR = CVErr(xlErrValue)
      Exit Function
      End If
      LD = Int(D)
      If LD <= 2 Then
      If LD = 1 Then TYPEJOUR = 2
      Exit Function
      End If
      T = (((255 - 11 * (A Mod 19)) - 21) Mod 30) + 21
      LP = DateSerial(A, 3, 2) + T + (T > 48) _
      + 6 - ((A + A \ 4 + T + (T > 48) + 1) Mod 7)
      Select Case D
      ' Jours fériés mobiles
      Case Is = LP, Is = LP + 38, Is = LP + 49
      TYPEJOUR = 2
      ' Jours fériés fixes
      Case Is = DateSerial(A, 1, 1), Is = DateSerial(A, 5, 1), _
      Is = DateSerial(A, 5, 8), Is = DateSerial(A, 7, 14), _
      Is = DateSerial(A, 8, 15), Is = DateSerial(A, 11, 1), _
      Is = DateSerial(A, 11, 11), Is = DateSerial(A, 12, 25)
      TYPEJOUR = 2
      Case Else
      ' Samedi ou dimanche
      If Weekday(D, vbMonday) >= 6 Then TYPEJOUR = 1
      End Select

      End Function


      Bien cordialement

      La science ne fait que trouver ce qui existe depuis toujours.
      Hubert REEVES.
      0
  2. Spiloack
     
    Re ! Quoi ? Il n'y a pas de spécialiste SQL ?!? Je ne peux pas le croire... ;o) J'espère encore quelques temps... :op

    Spiloack.
    1