Как получить разность рабочих дней в db2 без суббот и воскресений? - PullRequest
3 голосов
/ 15 ноября 2011

У меня есть таблица с некоторыми интервалами дат, например:

|id|group|date_start|date_end|

и я хотел бы сделать вид, который выглядит следующим образом:

|id|working_days_diff|

и

|id|group|working_days_diff|

Как я могу сделать что-то подобное? спасибо

Я думал о пользовательской функции, которая будет выполнять цикл для каждого дня разности и суммы, если DAYOFWEEK не суббота и воскресенье ... но я не знаю, как сделать ...

Ответы [ 5 ]

1 голос
/ 27 января 2015

Взято из Количество рабочих дней между двумя датами

(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
1 голос
/ 19 сентября 2013
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') 
1 голос
/ 15 ноября 2011
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
1 голос
/ 15 ноября 2011

Таблица календаря упрощает такой запрос (вот ссылка, специфичная для SQL Server):

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

Однако вы можете создать их для любой базы данных; ниже ссылка, предлагающая сделать это для db2:

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

1 голос
/ 15 ноября 2011

db2 имеет функцию с именем: TIMESTAMPDIFF , а не DATEDIFF. Используйте его, чтобы найти количество недель между датами, а затем умножьте на 5 (рабочие дни).

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

Примечание: функция является оценочной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...