A voir également:
- [SQL] intervalle de date
- Jm date désabonnement ✓ - Forum Consommation & Internet
- Airpods 3 date de sortie - Guide
- Trouver une date de naissance gratuit ✓ - Forum Google Chrome
- Sql lister les tables ✓ - Forum Programmation
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
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 :
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
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
25 oct. 2005 à 11:49
Spiloack.
25 oct. 2005 à 14:45
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.