У меня есть 2 Наборы для диапазонов дат:SQL - Получение рабочих дней диапазон дат в другой диапазон дат
@StartDate
и@EndDate
: передается в хранимую процедуруProjectStartDate
иProjectEndDate
: В базе данных
цель состоит в том, чтобы получить количество рабочих дней (праздничные дни игнорируются), что ProjectStartDate
ProjectEndDate
и падение между @StartDate
и @EndDate
.
Пример 1:
@StartDate = 2016/03/21
@EndDate = 2016/03/25
ProjectStartDate = 2016/03/13
ProjectEndDate = 2016/03/22
Таким образом, количество рабочих дней мне нужно работать будут где ProjectStartDate
и ProjectEndDate
падение beween @StartDate
и @Endate
- в этом случае, количество рабочих дней будет 2 (пн - пт)
Пример 2:
ProjectStartDate = 2016/03/22
ProjectEndDate = 2016/03/29
Таким образом, количество рабочих дней мне нужно работать НУ т есть где ProjectStartDate
и ProjectEndDate
падение между @StartDate
и @Endate
- в этом случае, количество рабочих дней будет 4 (пн - пт)
Пример 3:
ProjectStartDate = 2016/03/13
ProjectEndDate = 2016/03/29
Так количество рабочих дней мне нужно отработать то, где ProjectStartDate
и ProjectEndDate
падение между @StartDate
и @Endate
- в этом случае, количество рабочих дней будет 5 (пн - пт)
код я должен отработать рабочие дни выглядит следующим образом:
(DATEDIFF(dd, ISNULL(AA.DDAreaActivityActualStart,AA.DDAreaActivityPlannedStart), ISNULL(AA.DDAreaActivityActualEnd,AA.DDAreaActivityPlannedEnd)) + 1)
-(DATEDIFF(wk, ISNULL(AA.DDAreaActivityActualStart,AA.DDAreaActivityPlannedStart), ISNULL(AA.DDAreaActivityActualEnd,AA.DDAreaActivityPlannedEnd)) * 2)
-(CASE WHEN DATENAME(dw, ISNULL(AA.DDAreaActivityActualStart,AA.DDAreaActivityPlannedStart)) = 'Sunday' THEN 1 ELSE 0 END)
-(CASE WHEN DATENAME(dw, ISNULL(AA.DDAreaActivityActualStart,AA.DDAreaActivityPlannedStart)) = 'Saturday' THEN 1 ELSE 0 END)
Я попытался получить результат, но он частично работает. Я знаю, что есть более простой способ сделать это:
CASE WHEN(CASE WHEN @StartDate <= ISNULL(AA.DDAreaActivityActualStart,AA.DDAreaActivityPlannedStart)
THEN (DATEDIFF(dd, ISNULL(AA.DDAreaActivityActualStart,AA.DDAreaActivityPlannedStart), @EndDate) + 1)
-(DATEDIFF(wk, ISNULL(AA.DDAreaActivityActualStart,AA.DDAreaActivityPlannedStart), @EndDate) * 2)
-(CASE WHEN DATENAME(dw, ISNULL(AA.DDAreaActivityActualStart,AA.DDAreaActivityPlannedStart)) = 'Sunday' THEN 1 ELSE 0 END)
-(CASE WHEN DATENAME(dw, ISNULL(AA.DDAreaActivityActualStart,AA.DDAreaActivityPlannedStart)) = 'Saturday' THEN 1 ELSE 0 END)
ELSE (DATEDIFF(dd, @StartDate, ISNULL(AA.DDAreaActivityActualEnd,AA.DDAreaActivityPlannedEnd)) + 1)
-(DATEDIFF(wk, @StartDate, ISNULL(AA.DDAreaActivityActualEnd,AA.DDAreaActivityPlannedEnd)) * 2)
-(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END)
-(CASE WHEN DATENAME(dw, @StartDate) = 'Saturday' THEN 1 ELSE 0 END) END) >= 5
THEN 5
ELSE (CASE WHEN @StartDate <= ISNULL(AA.DDAreaActivityActualStart,AA.DDAreaActivityPlannedStart)
THEN (DATEDIFF(dd, ISNULL(AA.DDAreaActivityActualStart,AA.DDAreaActivityPlannedStart), @EndDate) + 1)
-(DATEDIFF(wk, ISNULL(AA.DDAreaActivityActualStart,AA.DDAreaActivityPlannedStart), @EndDate) * 2)
-(CASE WHEN DATENAME(dw, ISNULL(AA.DDAreaActivityActualStart,AA.DDAreaActivityPlannedStart)) = 'Sunday' THEN 1 ELSE 0 END)
-(CASE WHEN DATENAME(dw, ISNULL(AA.DDAreaActivityActualStart,AA.DDAreaActivityPlannedStart)) = 'Saturday' THEN 1 ELSE 0 END)
ELSE (DATEDIFF(dd, @StartDate, ISNULL(AA.DDAreaActivityActualEnd,AA.DDAreaActivityPlannedEnd)) + 1)
-(DATEDIFF(wk, @StartDate, ISNULL(AA.DDAreaActivityActualEnd,AA.DDAreaActivityPlannedEnd)) * 2)
-(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END)
-(CASE WHEN DATENAME(dw, @StartDate) = 'Saturday' THEN 1 ELSE 0 END) END) END AS DaysCalculated
Основываясь на вашем Sql синтаксиса я удалил тег MySql. –
любой шанс, что вход '@ StartDate' и' @ EndDate' будет включать Sat, Sun? – Squirrel
@Squirrel, В моем случае, StartDate и EndDate всегда будут в понедельник и пятницу. – AxleWack