|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : août 2006 Messages : 19 ![]() |
Bonjour,
J'essaie de faire une fonction qui me donnera le nb de jours ouvrés entre 2 dates (avec accès à une table qui contient les jours fériés). Je débute en PL/SQL et je bloque dès le début de ma fonction: sur le code ci-dessous, c'est l'alimentation de la variable DATE_VAR2 qui renvoie le 01858 mais je ne vois pas pourquoi. CREATE OR REPLACE FUNCTION FCT_NB_JOURS_OUVRES(DATE_DEB VARCHAR2, DATE_FIN VARCHAR2, TYPE_CALC INTEGER) RETURN NUMBER IS /****************************************************************************** Renvoie le nombre de jours ouvrés entre 2 dates paramètre 1 (date_deb) = date de début au format 'JJ/MM/AAAA' paramètre 2 (date_fin) = date de fin au format 'JJ/MM/AAAA' paramètre 3 (type_calc) = type de calcul 1 = Général 2 = Alsace-Moselle utilise la table XFERIES ******************************************************************************/ NB_JO NUMBER(3); DATE_VAR VARCHAR2(20); DATE_VAR2 DATE; NO_JOUR VARCHAR2(1); BEGIN NB_JO := 0; DATE_VAR := DATE_DEB; WHILE DATE_VAR <> DATE_FIN LOOP DATE_VAR2 := TO_DATE(DATE_VAR, 'DD/MM/RRRR'); NO_JOUR := TO_CHAR(DATE_VAR2, 'D'); Si quelqu'un a une idée, merci d'avance... |
|
|
00
|
|
|
#2 |
|
Membre du Club
![]() Inscription : mars 2007 Messages : 76 ![]() |
En créant cette fonction je ne rencontre pas l'erreur :
CREATE OR REPLACE FUNCTION TEST(DATE_DEB VARCHAR2, DATE_FIN VARCHAR2) RETURN NUMBER IS NB_JO NUMBER(3); DATE_VAR VARCHAR2(20); DATE_VAR2 DATE; NO_JOUR VARCHAR2(1); BEGIN NB_JO := 0; DATE_VAR := DATE_DEB; DATE_VAR2 := TO_DATE(DATE_VAR, 'DD/MM/RRRR'); END; tu es sur que l'erreur vient de "DATE_VAR2 := TO_DATE(DATE_VAR, 'DD/MM/RRRR');" ? |
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : août 2006 Messages : 19 ![]() |
Bonjour
D'après mes tests (j'ai fait ça avec TOAD), c'était bien cette ligne qui posait problème. J'ai finalement résolu mon problème hier soir, je mets mon code ci-dessous. Il est évident qu'il pourrait être amélioré (il faut notamment mettre tous les jours de l'année dans la table XFERIES et pas uniquement les jours fériés) mais je verrai cela plus tard. CREATE OR REPLACE FUNCTION Fct_Nb_Jours_Ouvres(DATE_DEB VARCHAR2, DATE_FIN VARCHAR2, TYPE_CALC INTEGER) RETURN NUMBER IS /****************************************************************************** Renvoie le nombre de jours ouvrés entre 2 dates paramètre 1 (date_deb) = date de début au format 'JJ/MM/AAAA' paramètre 2 (date_fin) = date de fin au format 'JJ/MM/AAAA' paramètre 3 (type_calc) = type de calcul 1 = Général 2 = Alsace-Moselle Utilise la table XFERIES (attention, cette table doit obligatoirement contenir tous les jours de l'année) ******************************************************************************/ DATE_VAR VARCHAR2(20); DATE_VAR2 DATE; NO_JOUR VARCHAR2(1); JF NUMBER(1); NB_JO NUMBER(3); BEGIN NB_JO := 0; DATE_VAR := DATE_DEB; LOOP DATE_VAR2 := TRUNC(TO_DATE(DATE_VAR, 'DD/MM/YYYY')); NO_JOUR := TO_CHAR(DATE_VAR2, 'D'); IF NO_JOUR IN ('1', '2', '3', '4', '5') THEN IF TYPE_CALC = 1 THEN SELECT GENERAL INTO JF FROM XFERIES WHERE DATE_FERIEE = DATE_VAR2; IF JF <> 1 THEN NB_JO := NB_JO + 1; END IF; ELSE SELECT ALSACE_MOSELLE INTO JF FROM XFERIES WHERE DATE_FERIEE = DATE_VAR2; IF JF <> 1 THEN NB_JO := NB_JO + 1; END IF; END IF; END IF; EXIT WHEN DATE_VAR = DATE_FIN; DATE_VAR2 := TO_DATE(DATE_VAR, 'DD/MM/YYYY') + 1; DATE_VAR := TO_CHAR(DATE_VAR2, 'DD/MM/YYYY'); END LOOP; RETURN NB_JO; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN OTHERS THEN RAISE; END Fct_Nb_Jours_Ouvres; / |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com