Snowflake 中两个日期之间的工作日
Working days between two dates in Snowflake
有什么方法可以在不创建日历的情况下计算雪花中两个日期之间的工作日table,仅使用“datediff”函数
在对雪花日期差异函数进行研究工作后,我发现了以下结论。
- DATEDIFF(DAY/WEEK, START_DATE, END_DATE) 将计算差异,但最后一个日期将被视为 END_DATE -1.
- DATEDIFF(WEEK, START_DATE, END_DATE) 将计算两个日期之间的星期日数。
通过总结这两点,我实现了下面的逻辑。
SELECT
( DATEDIFF(DAY, START_DATE, DATEADD(DAY, 1, END_DATE))
- DATEDIFF(WEEK, START_DATE, DATEADD(DAY, 1, END_DATE))*2
- (CASE WHEN DAYNAME(START_DATE) != 'Sun' THEN 1 ELSE 0 END)
+ (CASE WHEN DAYNAME(END_DATE) != 'Sat' THEN 1 ELSE 0 END)
) AS WORKING_DAYS
这是一篇带有日历 table 解决方案的文章,其中还包含一个 UDF 以在 Snowflake 中解决此问题(工作日是硬编码的,因此确实需要一些维护,但您不必至少维护一个日历 table):
有什么方法可以在不创建日历的情况下计算雪花中两个日期之间的工作日table,仅使用“datediff”函数
在对雪花日期差异函数进行研究工作后,我发现了以下结论。
- DATEDIFF(DAY/WEEK, START_DATE, END_DATE) 将计算差异,但最后一个日期将被视为 END_DATE -1.
- DATEDIFF(WEEK, START_DATE, END_DATE) 将计算两个日期之间的星期日数。
通过总结这两点,我实现了下面的逻辑。
SELECT
( DATEDIFF(DAY, START_DATE, DATEADD(DAY, 1, END_DATE))
- DATEDIFF(WEEK, START_DATE, DATEADD(DAY, 1, END_DATE))*2
- (CASE WHEN DAYNAME(START_DATE) != 'Sun' THEN 1 ELSE 0 END)
+ (CASE WHEN DAYNAME(END_DATE) != 'Sat' THEN 1 ELSE 0 END)
) AS WORKING_DAYS
这是一篇带有日历 table 解决方案的文章,其中还包含一个 UDF 以在 Snowflake 中解决此问题(工作日是硬编码的,因此确实需要一些维护,但您不必至少维护一个日历 table):