SPL 能否实现以周一为起始日期的周数统计
大佬们,有个需求得麻烦你们看一下,我想返回某个日期在其对应年度的第几周,或者对应月份的第几周,以周一为每周的第一天返回一个整数。目前,SPL 能返回以周日为每周第一天的周数,举例如下:
A | B | C | D | E | |
1 | 日期 | 2023/1/1 | 2023/1/2 | 2023/1/3 | 2023/1/4 |
2 | 2023/1/5 | 2023/1/6 | 2023/1/7 | 2023/1/8 | 2023/9/1 |
3 | 2023/9/2 | 2023/9/3 | 2023/9/4 | 2023/9/5 | 2023/9/6 |
4 | 2023/9/7 | 2023/9/8 | 2023/9/9 | 2023/9/10 | |
5 | =[A1:E4].(if(#>1,date(~,“yyyy/MM/dd”),~)).record(1) | 返回日期对应年度的第几周和对应月份的第几周 | |||
6 | =A5.derive(string( 日期,“E”): 星期,string(日期,“w”): 年度第几周 (周日),string(日期,“W”): 月度第几周 (周日)) |
可以看到,string(日期,“w"或者"W”)返回的年 (月) 度周数是以周日为每周的起始日期计算的:
SPL 中的 string 函数能不能实现以每周一为开始日期返回年 (月) 度的周数,如下所示,我用了 interval@1 计算跟年初月初相隔了多少个周一,这样写不是很直接:
A | |
6 | =A5.derive(string( 日期,"E"): 星期,1+interval@1(pdate@y( 日期), 日期 ): 年度第几周 ( 周一),1+interval@1(pdate@m( 日期), 日期 ): 月度第几周 ( 周一)) |
EXCEL 里计算周数的时候,有个 WEEKNUM 函数,它的 2 参可以让用户选择每周起始于哪一天,如下:
还有,SPL 的日期比较函数 deq@w,时间精确到周的比较,那什么样的算一周,这里也是有关系的。再有一个,pdate@w, 返回日期所在周的周日,视同每周的开始,而 pdate@we 返回的是周六,视同每周的结束,最好是有一个选项,也就是说,凡是精确到周的,都要有一个合适的对周的定义,起始日期是周一还是周日。
当然,我描述的不够全面,关于日期时间的维度分析,有点小复杂,比如按周统计时,跨年的时候咋弄,还有一些企业的财年也是不一样的,有按自然日历为财年的,也有 3 月 1 日开始到下年 2 月底为一个财年的,也有 7 月 1 日到下年 6 月底为一个财年的,五花八门。也就是说,对于财年或者会计年度,每年的第一天不一定是 1 月 1 日,每年的最后一天也不一定是 12 月 31 日,最好也有一个相关的选项。
以上需求,恳请 SPL 大佬们得闲时考虑一下,先谢为敬!!!
pdate、deq 函数增加了 @w1 选项,用于指定把周一当做周的第一天。
string 函数有 Locale 参数,通过这个参数可以实现把周一当做周的第一天,语法是:=string(now(),“w”:“de”)
把周一当做周的第一天的 Locale 有 "de"、“en-GB”、"it" 等
谢谢大佬,string 函数没有问题了。
pdate@w1 和 deq@w1 选项,试了没有变化,jar 包是今天下午 4 点的包,不知道是没更新好还是我哪里没弄对?
粗略地总结了一下 string 函数返回第几周的用法,以周一为每周的开始,仅供参考:
结果如下所示,可以发现,3 个用法虽然都是以周一为每周的第一天,但在处理跨年的时候是不一样的,具体用哪一个,得看业务需求。
以下是区域码的参考表:
应该是还没更新,我大概 4:30 上传的
jar 文件已经更新,请移步下载贴中下载 esproc-bin.jar 即可