【问题标题】:Working days between two dates in Snowflake雪花中两个日期之间的工作日
【发布时间】:2021-04-24 10:36:15
【问题描述】:

有没有办法在雪花中计算两个日期之间的工作日而不创建日历表,只使用“datediff”函数

【问题讨论】:

    标签: sql date calendar snowflake-cloud-data-platform datediff


    【解决方案1】:

    这是一篇包含日历表解决方案的文章,其中还包括一个用于在 Snowflake 中解决此问题的 UDF(工作日是硬编码的,因此确实需要一些维护,但您至少不必维护日历表):

    https://medium.com/dandy-engineering-blog/how-to-calculate-the-number-of-working-hours-between-two-timestamps-in-sql-b5696de66e51

    【讨论】:

      【解决方案2】:

      在做雪花日期差异函数的研究工作后,我发现了以下结论。

      1. DATEDIFF(DAY/WEEK, START_DATE, END_DATE) 将计算差异,但最后一个日期将被视为 END_DATE -1。
      2. 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   
      

      【讨论】:

      • 不错的解决方案!您可以通过将 (CASE WHEN DAYNAME(START_DATE) != 'Sun' THEN 1 ELSE 0 END) 转换为 IFF(DAYNAME(START_DATE) != 'Sun', 1, 0) 来缩短它。
      • (周日的逻辑是否应该与!=相反?)
      • 如果你想要星期天的数量,那么你可以直接使用这个代码:DATEDIFF(WEEK, START_DATE, DATEADD(DAY, 1, END_DATE))
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      相关资源
      最近更新 更多