如何在 Informix 中获取两个日期之间的工作日数
How to get number of working days in Informix between two dates
我需要在 Informix 中创建函数来计算两个给定日期之间的工作日数。
我创建了带假期的 table "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)之间的天数,而不是工作日数。
我哪里出错了?
你的循环递增 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
。
我需要在 Informix 中创建函数来计算两个给定日期之间的工作日数。 我创建了带假期的 table "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)之间的天数,而不是工作日数。 我哪里出错了?
你的循环递增 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
。