#sql #date #calendar #snowflake-cloud-data-platform #datediff
#sql #Дата #Календарь #snowflake-cloud-data-platform #datediff
Вопрос:
Есть ли какие-либо способы вычисления рабочих дней между двумя датами в snowflake без создания таблицы календаря, используя только функцию «datediff»
Ответ №1:
Вот статья с решением для таблицы календаря, которое также включает UDF для решения этой проблемы в Snowflake (рабочие дни жестко запрограммированы, поэтому это требует некоторого обслуживания, но вам не нужно поддерживать таблицу календаря, по крайней мере):
Ответ №2:
После исследовательской работы над функцией snowflake 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
Комментарии:
1. Хорошее решение! Вы могли бы сократить его, преобразовав
(CASE WHEN DAYNAME(START_DATE) != 'Sun' THEN 1 ELSE 0 END)
в aIFF(DAYNAME(START_DATE) != 'Sun', 1, 0)
.2. (должна ли логика для воскресенья быть противоположной
!=
?)3. Если вам нужно количество воскресений, вы можете напрямую использовать этот код: DATEDIFF(WEEK, START_DATE, DATEADD(DAY, 1, END_DATE))