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

时间:2017-12-20 14:59:56

标签: kdb q-lang

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

给出一个函数原型:

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

}

谢谢,节日快乐

3 个答案:

答案 0 :(得分:3)

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

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

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

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

要提升日期顺序。

答案 1 :(得分: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}

答案 2 :(得分:0)

知道2000.01.01和2000.01.02是星期六和星期日,那些日期是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个工作日,不包括您选择的假期。