3 votes

Comment obtenir la différence entre les jours ouvrables dans db2 sans les samedis et les dimanches ?

J'ai un tableau avec des intervalles de dates comme ceci :

|id|group|date_start|date_end|

et je voudrais faire une vue qui ressemble à :

|id|working_days_diff|

y

|id|group|working_days_diff|

Comment puis-je faire quelque chose comme ça ? Merci

Je pensais à une fonction personnalisée qui bouclerait pour chaque jour de la différence et ferait la somme si DAYOFWEEK n'est pas samedi et dimanche... mais je ne sais pas comment faire....

3voto

Irawan Soetomo Points 649

Tiré de Compter les jours ouvrables entre deux dates

(days(PAID_DATE) - days(SUBMISSION_DATE) + 1) -
((52 * (year(PAID_DATE) - year(SUBMISSION_DATE)) + week(PAID_DATE) - week(SUBMISSION_DATE)) * 2) - 
(case when dayofweek(SUBMISSION_DATE) = 1 then 1 else 0 end) -
(case when dayofweek(PAID_DATE) = 7 then 1 else 0 end)
as SUBMISSION_TO_PAID

1voto

Eystein Bye Points 2674

Db2 a une fonction appelée : TIMESTAMPDIFF et non DATEDIFF. Utilisez-le pour trouver le nombre de semaines entre les dates, puis multipliez-le par 5 (jours de la semaine).

 TIMESTAMPDIFF(32,CHAR(TIMESTAMP('2001-09-29-11.25.42.123456') - TIMESTAMP('2001-09-26-12.07.58.123456'))) 

NB : la fonction est une estimation

1voto

Totty Points 2708
CREATE FUNCTION stkqry.WORKING_DAY_DIFF(DATE_START date, DATE_END date)          
RETURNS INTEGER                                            
LANGUAGE SQL
BEGIN
    DECLARE WORKING_DAYS INTEGER DEFAULT 0;
    DECLARE DATE_COUNTER DATE;
    SET DATE_COUNTER = DATE_START;
    WHILE DAYS(DATE_COUNTER) < DAYS(DATE_END) DO
        SET DATE_COUNTER = DATE(days(DATE_COUNTER)+1);

        CASE WHEN DAYOFWEEK_ISO(DATE_COUNTER) = 6 THEN
            SET WORKING_DAYS = WORKING_DAYS;
        WHEN DAYOFWEEK_ISO(DATE_COUNTER) = 7 THEN
            SET WORKING_DAYS = WORKING_DAYS;
        ELSE
            SET WORKING_DAYS = WORKING_DAYS + 1;
        END CASE;
    END WHILE;
    RETURN WORKING_DAYS;
END

1voto

Stuart Ainsworth Points 7529

Une table de calendrier facilite ce genre de requête (voici un lien spécifique à SQL Server) :

http://web.archive.org/web/20070611150639/http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html

Cependant, vous pouvez les construire pour n'importe quelle base de données ; vous trouverez ci-dessous un lien suggérant comment le faire pour db2 :

http://bytes.com/topic/db2/answers/181183-calculating-business-days

1voto

yzy Points 11
select 
TIMESTAMPDIFF(32,CHAR(
    TIMESTAMP(
        (CHAR(date('2013-09-19') - (DAYOFWEEK_ISO('2013-09-19')-1) DAYS ))||'-00.00.00.000000'
    ) 
    - TIMESTAMP(
        (CHAR(date('2013-09-13') - (DAYOFWEEK_ISO('2013-09-13')-1) DAYS )||'-00.00.00.000000')
    )
))*5 + DAYOFWEEK_ISO('2013-09-19')- DAYOFWEEK_ISO('2013-09-13')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X