SQL для получения количества рабочих дней между двумя датами

Мне нужно получить количество «рабочих дней» между любыми двумя заданными датами, и для этой цели я попробовал этот запрос, который отлично работает, но я не могу понять его часть. Пожалуйста, объясните мне это:

SELECT (DATEDIFF(dd, '2015-01-04', '2015-01-10') + 1)-
        (DATEDIFF(wk, '2015-01-04', '2015-01-10') * 2)-
        (CASE WHEN DATENAME(dw, '2015-01-04') = 'Sunday' THEN 1 ELSE 0 END)-
        (CASE WHEN DATENAME(dw, '2015-01-10') = 'Saturday' THEN 1 ELSE 0 END)

Я так много знаю:

  • Первая строка получает все дни, включая указанные даты.
  • Вторая строка проверяет количество недель, прошедших между этими днями, поэтому из общего числа дней вычитаются требуемые выходные.

Теперь меня смущают последние две строчки. Он проверяет, является ли первая дата воскресеньем, а затем вычитает 1 из общего числа, аналогично тому, чтобы последняя дата была субботой. Но что, если первое свидание — СУББОТА, а последнее — ВОСКРЕСЕНЬЕ?


person Hyder    schedule 30.06.2015    source источник


Ответы (1)


Последняя строка удаляет неполные недели, что происходит только в том случае, если начальная дата приходится на воскресенье, а последняя дата — на субботу.

Вторая строка, (DATEDIFF(wk, '2015-01-04', '2015-01-10') * 2), подсчитывает все выходные, то есть пара Saturday-Sunday. Итак, в вашем вопросе, если первая дата - Saturday , то она будет считаться одной парой Saturday-Sunday. То же самое будет применяться, если последняя дата выпадает на Sunday.

person Felix Pamittan    schedule 30.06.2015