查找日期,省略周末和假期

问题描述 投票:0回答:3

我正在尝试创建一个避免使用循环/ while的函数的最佳方法。有任何想法吗?

给定函数原型:

{[sd;n:hols]
/ return list of n number of dates <= SD, excluding weekends and hols 

}

谢谢,节日快乐

kdb q-lang
3个回答
1
投票

另一种解决方案是在计算模数之前排除假期:

{[sd;n;hols] d where 1<mod[d:except[;hols]sd-til n]7}

这里的组件类似于Ryan的答案,而不是使用“except”来排除假期。

为了准确提取n天,您最初可以生成更大的列表并返回正确长度的子列表,例如

{[sd;n;hols] n#d where 1<mod[d:except[;hols]sd-til 2*n]7}


3
投票

您可以使用列表以及kdb +中的日期构建在基础整数上的事实:

{[sd;n;hols] d where not[d in hols]&1<mod[d:sd-til n]7}

这使用til生成截至今天的日期列表,然后使用mod过滤,同时检查以确保剩余日期不在假日过滤器列表中,然后使用真实结果索引回生成日期名单。这些将按降序排列,但您可以使用

{[sd;n;hols] reverse d where not[d in hols]&1<mod[d:sd-til n]7}

要有升序日期顺序。


0
投票

知道2000.01.01和2000.01.02是星期六和星期日,那些mod的日期是0和1,然后排除所有模块的日期是0 1我用过:

getBusinessDays:{[Dates;N;Hols] N#(Dates*(Dates mod 7) in 2 3 4 5 6) except 2000.01.01,Hols}

将返回您输入的前N个工作日,不包括您选择的假期。

© www.soinside.com 2019 - 2024. All rights reserved.