Я считаю, что проблема в его WHERE
предложении:
where cast(Edatetime as date) between '2019-11-03' and '2019-11-03'
Почему бы не cast(Edatetime as date) = '2019-11-03'
? Я не уверен, к какой таблице принадлежит столбец Edatetime
(необходимо указать все столбцы с правильным именем / псевдонимом таблицы). Вы должны переместить условие в предложение ON:
WITH CTE AS
(
select U.Name,U.Adluserid as 'Empid',
min(case when IOType=0 then Edatetime end) as 'IN',
max(case when IOType=1 then Edatetime end) as 'out',
case max(E.Status) when 1 then 'AL' when 2 then 'SL' else 'L' end as leave_status
from Mx_UserMst U
left join Mx_ACSEventTrn on Mx_ACSEventTrn.UsrRefcode=U.UserID and (cast(Edatetime as date) between '2019-11-03' and '2019-11-03')
left join Tbl_Zeo_Empstatus E on Mx_ACSEventTrn.UsrRefcode=E.Emp_Id
group by U.Name,U.Adluserid
)
SELECT [Name], [Empid],[IN],[OUT],
case
when cast([IN] as time) is null then cast(leave_status as nvarchar(50))
when cast([IN] as time) < cast('08:15' as time) then 'P'
else 'L'
end as status
FROM CTE
Если Edatetime
принадлежит Tbl_Zeo_Empstatus
, переместите условие в предложение ON
следующего соединения. Я также изменил RIGHT
на LEFT
соединение, чтобы сделать оператор более читабельным.