如何在两个日期之间获取Informix中的工作日数

时间:2015-04-20 13:01:46

标签: sql informix

我需要在Informix中创建函数来计算两个给定日期之间的工作日数。 我已经创建了带有假期的表“prazkal”和两个Informix函数:

create function is_holiday(d datetime year to day)
returning boolean;
    define hcnt integer;

    if weekday(d) = 0 or weekday(d) = 6 then
        return 't';
    end if;

    ---code that check if 'd' is marked as holiday in calendar
    select count(*) into hcnt from prazkal where datpra = d;
    if hcnt > 0 then
      return 't';
    end if;

    return 'f';
end function;

create function work_days(start_d DATE, end_d DATE)
returning integer;
define new_d datetime year to day;
define count_days integer;
define i integer;
    let i = 0;

    let count_days = end_d - start_d;
    let new_d = CAST(end_d AS DATETIME YEAR TO DAY);


    while i < count_days
        let new_d = new_d - interval(1) day to day;
        if not is_holiday(new_d) then
            let i = i + 1;
        end if;
    end while


    return i;
end function;

我的两个函数都是从post修改的。 函数work_days的结果是两个日期(end_d,start_d)之间的天数,而不是工作日数。 我在哪里犯了错误?

1 个答案:

答案 0 :(得分:1)

您的循环会增加i,直到它是count_days中的数字,因此答案将始终为count_days(计算速度非常慢)。您还需要第二个条件new_d > start_d

while i < count_days and new_d > start_d
    let new_d = new_d - interval(1) day to day;
    if not is_holiday(new_d) then
        let i = i + 1;
    end if;
end while

>是合适的,因为循环递减然后检查new_d,因此最后一个循环测试start_d