Рабочие дни между двумя датами в Snowflake

#sql #date #calendar #snowflake-cloud-data-platform #datediff

#sql #Дата #Календарь #snowflake-cloud-data-platform #datediff

Вопрос:

Есть ли какие-либо способы вычисления рабочих дней между двумя датами в snowflake без создания таблицы календаря, используя только функцию «datediff»

Ответ №1:

Вот статья с решением для таблицы календаря, которое также включает UDF для решения этой проблемы в Snowflake (рабочие дни жестко запрограммированы, поэтому это требует некоторого обслуживания, но вам не нужно поддерживать таблицу календаря, по крайней мере):

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

Ответ №2:

После исследовательской работы над функцией snowflake datediff я пришел к следующим выводам.

  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   
 

Комментарии:

1. Хорошее решение! Вы могли бы сократить его, преобразовав (CASE WHEN DAYNAME(START_DATE) != 'Sun' THEN 1 ELSE 0 END) в a IFF(DAYNAME(START_DATE) != 'Sun', 1, 0) .

2. (должна ли логика для воскресенья быть противоположной != ?)

3. Если вам нужно количество воскресений, вы можете напрямую использовать этот код: DATEDIFF(WEEK, START_DATE, DATEADD(DAY, 1, END_DATE))