[SQL] intervalle de date

Fermé
Spiloack - 18 oct. 2005 à 16:34
 Jacques - 25 oct. 2005 à 14:45
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.

2 réponses

crabs Messages postés 908 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 3 août 2008 507
21 oct. 2005 à 18:25
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
Ok, j'ai compris ce qu'il me reste à faire... ;o) Merci pour ta réponse !

Spiloack.
0
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
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