Мне нужно получить для каждого пользователя, сколько дней недели они проработали (в месяце), у меня есть таблица, в которой хранится диапазон дат, в котором они не работали (отпуск по болезни), и таблица учета, в которой хранятся рабочие дни.
ausentismoT хранит нерабочие дни как диапазоны дат, таблица выглядит следующим образом
user ini fin --ini = start date | fin = end date
---------------------------
john 06/05/2019 06/05/2019
john 13/05/2019 13/05/2019
john 20/05/2019 24/05/2019
Таблица подсчета, хранящая каждый день месяца и помечающая их статус как праздник:
IDCal fechaValor numDiaSemana nomDia nomMes semanaAno diaJuliano feriadoBancario feriadoNombre
---------------------------------------------------------------------------------------------
20190502 2019-05-02 00:00:00.000 4 Jueves Mayo 18 122 0 NULL
20190503 2019-05-03 00:00:00.000 5 Viernes Mayo 18 123 0 NULL
20190504 2019-05-04 00:00:00.000 6 Sábado Mayo 18 124 1 Weekend
Мой код, который я знаю, что логика неверна, я "пытаюсь" исключить как праздничные, так и нерабочие дни, но результаты равны 0 во всех столбцах:
SELECT T.RUT_DV,
T.USER,
DIAS_HAB_MES = (SELECT COUNT(CONVERT(INT,feriadoBancario,112)) AS D FROM CALENDAR C WHERE feriadoBancario=0 AND CONVERT(NVARCHAR(6),C.fechaValor,112) = CONVERT(NVARCHAR(6),GETDATE(),112)),
LUNES = (SELECT COUNT(CONVERT(INT,feriadoBancario,112)) AS D FROM CALENDAR C
WHERE numDiaSemana=1 AND feriadoBancario = 0 AND (FECHAVALOR BETWEEN DATEADD(MM, DATEDIFF(MM, 0, GETDATE())-1, 0) AND T2.INI) AND FECHAVALOR BETWEEN DATEADD(MM, DATEDIFF(MM, 0, getdate()), 0)-1 AND T2.FIN),
MARTES = (SELECT COUNT(CONVERT(INT,feriadoBancario,112)) AS D FROM CALENDAR C
WHERE numDiaSemana=2 AND feriadoBancario = 0 AND (FECHAVALOR BETWEEN DATEADD(MM, DATEDIFF(MM, 0, GETDATE())-1, 0) AND T2.INI) AND FECHAVALOR BETWEEN DATEADD(MM, DATEDIFF(MM, 0, getdate()), 0)-1 AND T2.FIN),
MIERCOLES = (SELECT COUNT(CONVERT(INT,feriadoBancario,112)) AS D FROM CALENDAR C
WHERE numDiaSemana=3 AND feriadoBancario = 0 AND (FECHAVALOR BETWEEN DATEADD(MM, DATEDIFF(MM, 0, GETDATE())-1, 0) AND T2.INI) AND FECHAVALOR BETWEEN DATEADD(MM, DATEDIFF(MM, 0, getdate()), 0)-1 AND T2.FIN),
JUEVES = (SELECT COUNT(CONVERT(INT,feriadoBancario,112)) AS D FROM CALENDAR C
WHERE numDiaSemana=4 AND feriadoBancario = 0 AND (FECHAVALOR BETWEEN DATEADD(MM, DATEDIFF(MM, 0, GETDATE())-1, 0) AND T2.INI) AND FECHAVALOR BETWEEN DATEADD(MM, DATEDIFF(MM, 0, getdate()), 0)-1 AND T2.FIN),
VIERNES = (SELECT COUNT(CONVERT(INT,feriadoBancario,112)) AS D FROM CALENDAR C
WHERE numDiaSemana=5 AND feriadoBancario = 0 AND (FECHAVALOR BETWEEN DATEADD(MM, DATEDIFF(MM, 0, GETDATE())-1, 0) AND T2.INI) AND FECHAVALOR BETWEEN DATEADD(MM, DATEDIFF(MM, 0, getdate()), 0)-1 AND T2.FIN)
FROM dotacionAD T -- BASE TABLE
LEFT JOIN ausentismoT T2 ON T.RUT_DV = REPLACE(T2.RUT_DV,'.','')
Результаты таковы:
NOM_COL DIAS_HAB_MES LUNES MARTES MIERCOLES JUEVES VIERNES
-------------------------------------------------------------------
JOHN 20 0 0 0 0 0
Для того же случая должно отображаться это:
NOM_COL DIAS_HAB_MES LUNES MARTES MIERCOLES JUEVES VIERNES
-------------------------------------------------------------------
JOHN 20 1 3 3 4 4