我试图想出创建一个避免使用循环/ while的函数的最佳方法。有任何想法吗?
给出一个函数原型:
{[sd;n:hols]
/ return list of n number of dates <= SD, excluding weekends and hols
}
谢谢,节日快乐
答案 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个工作日,不包括您选择的假期。