Табличная функция SQL не дает правильного значения - PullRequest
0 голосов
/ 23 октября 2019

У меня есть эта функция, которую я создал, чтобы получить общее число отсутствующих сотрудников за месяц. Когда я предоставляю параметры в теле запроса 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)

Невозможно предоставить пример данных, так как они достаточно велики для обработки, поэтому я надеюсь, что кто-то может выяснить проблему, просто проанализировав код. Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...