У меня есть эта функция, которую я создал, чтобы получить общее число отсутствующих сотрудников за месяц. Когда я предоставляю параметры в теле запроса sql и выполняю команду, она прекрасно работает, но когда я предоставляю значения в параметрах и выполняю функцию, она возвращает 0 во всех случаях. Вот моя функция. Я думаю, что упускаю что-то вроде конверсии или чего-то еще, но не могу докопаться до сути проблемы. Надеюсь, что кто-то может помочь
CREATE FUNCTION [dbo].[fnGetAbsentCount]
(
@StartDate AS DATETIME,
@EndDate DATETIME,
@EmpCode INT
)
RETURNS TABLE
AS
RETURN
(
SELECT SUM(Status) Absentss
FROM (
SELECT
CASE WHEN
IsOffDay = 1 AND PreviousDayTimeIn IS NULL AND PreviousDayTimeOut IS NULL AND NextDayTimeIn IS NULL AND NextDayTimeOut IS NULL THEN 1
WHEN IsOffDay = 1 AND (PreviousDayTimeIn IS NOT NULL OR PreviousDayTimeOut IS NOT NULL OR NextDayTimeIn IS NOT NULL OR NextDayTimeOut IS NOT NULL) THEN 0
WHEN IsPublicHoliday = 1 AND PreviousDayTimeIn IS NULL AND PreviousDayTimeOut IS NULL AND NextDayTimeIn IS NULL AND NextDayTimeOut IS NULL THEN 1
WHEN IsPublicHoliday = 1 AND (PreviousDayTimeIn IS NOT NULL OR PreviousDayTimeOut IS NOT NULL OR NextDayTimeIn IS NOT NULL OR NextDayTimeOut IS NOT NULL) THEN 0
WHEN TimeIn1 IS NULL AND TimeOut1 IS NULL THEN 1 ELSE 0 END Status
FROM
(
SELECT
[dbo].[fnIsOffDay](datename(dw,CAST(CalendarDate AS DATE)), @EmpCode) AS IsOffDay,
[dbo].[fnIsPublicHoliday](CAST(CalendarDate AS DATE), @EmpCode) AS IsPublicHoliday,
PreviousDayTimeIn = [dbo].[fnGetTimeInOut](1,DATEADD(DD, -1, CAST(CalendarDate AS DATE)), @EmpCode, 1),
TimeIn1 = [dbo].[fnGetTimeInOut](1,CAST(CalendarDate AS DATE), @EmpCode, 1),
NextDayTimeIn = [dbo].[fnGetTimeInOut](1,DATEADD(DD, 1, CAST(CalendarDate AS DATE)), @EmpCode, 1),
PreviousDayTimeOut = CASE WHEN [dbo].[fnGetTimeInOut](0,DATEADD(DD, -1, CAST(CalendarDate AS DATE)), @EmpCode, 2) IS NULL THEN [dbo].[fnGetTimeInOut](0,DATEADD(DD, -1, CAST(CalendarDate AS DATE)), @EmpCode, 1)
ELSE [dbo].[fnGetTimeInOut](0,DATEADD(DD, -1, CAST(CalendarDate AS DATE)), @EmpCode, 2) END,
TimeOut1 = CASE WHEN [dbo].[fnGetTimeInOut](0,CAST(CalendarDate AS DATE), @EmpCode, 2) IS NULL THEN [dbo].[fnGetTimeInOut](0,CAST(CalendarDate AS DATE), @EmpCode, 1)
ELSE [dbo].[fnGetTimeInOut](0,CAST(CalendarDate AS DATE), @EmpCode, 2) END,
NextDayTimeOut = CASE WHEN [dbo].[fnGetTimeInOut](0,DATEADD(DD, 1, CAST(CalendarDate AS DATE)), @EmpCode, 2) IS NULL THEN [dbo].[fnGetTimeInOut](0,DATEADD(DD, 1, CAST(CalendarDate AS DATE)), @EmpCode, 1)
ELSE [dbo].[fnGetTimeInOut](0,DATEADD(DD, 1, CAST(CalendarDate AS DATE)), @EmpCode, 2) END
FROM [CalendarDates]
WHERE CAST(CAST(CalendarDate AS DATE) AS DATE) BETWEEN @StartDate AND @StartDate
)T
)S
)
--SELECT * FROM [dbo].[fnGetAbsentCount] ('2019-09-01', '2019-09-30', 17)
Невозможно предоставить пример данных, так как они достаточно велики для обработки, поэтому я надеюсь, что кто-то может выяснить проблему, просто проанализировав код. Спасибо