Hi @Analyst_SQL ,
Please also refer below:
;with cte as (
select a.EnrollNumber,b.D_Date,b.Day,c.A_Date
from #EmpMaster a
cross join #MonthDate b
left join #AttendenceLOG c
on a.EnrollNumber=c.EnrollNumber
and cast(c.A_Date as date)=b.D_Date)
,cte1 AS (
SELECT EnrollNumbeR,D_Date,Day
,MIN(A_Date) [IN(A_Date)],MAX(A_Date) [OUT(A_Date)]
FROM CTE
GROUP BY EnrollNumbeR,D_Date,Day)
,CTE2 AS (
SELECT EnrollNumbeR,D_Date,Day
,CASE WHEN [IN(A_Date)] >=DATEADD(HOUR,12,CAST(CAST([IN(A_Date)] AS DATE) AS DATETIME)) THEN NULL ELSE [IN(A_Date)] END [IN(A_Date)]
,CASE WHEN [OUT(A_Date)] >=DATEADD(HOUR,12,CAST(CAST([OUT(A_Date)] AS DATE) AS DATETIME)) THEN [OUT(A_Date)] ELSE NULL END [OUT(A_Date)]
FROM cte1)
,CET3 as (
SELECT *
,CASE WHEN [DAY] ='Sunday' THEN 'S'
WHEN [IN(A_Date)] IS NULL AND [OUT(A_Date)] IS NULL THEN 'A'
WHEN DATEDIFF(HOUR,[IN(A_Date)],[OUT(A_Date)])>=8 THEN 'P'
ELSE 'A' END STATUS,
CASE WHEN [IN(A_Date)] IS NOT NULL AND [OUT(A_Date)] IS NOT NULL AND DATEDIFF(HOUR,[IN(A_Date)],[OUT(A_Date)])>=8
THEN CAST(CAST(DATEDIFF(MINUTE,[IN(A_Date)],[OUT(A_Date)]) AS FLOAT)/60 AS decimal(10,2)) ELSE 0 END [HOUR]
FROM CTE2)
SELECT EnrollNumbeR,D_Date,Day
,CASE WHEN [IN(A_Date)] IS NULL AND [OUT(A_Date)] IS NULL AND [STATUS]='A'
THEN [STATUS]
ELSE CONVERT(varchar(30),[IN(A_Date)],121)
END [IN(A_Date)]
,[OUT(A_Date)],[STATUS],[HOUR]
FROM CET3
ORDER BY D_Date,EnrollNumbeR
Output:
If above is not working, please provide the rule of [IN(A_Date)] ='A'. Thanks.
Best regards,
Melissa
If the answer is helpful, please click "Accept Answer" and upvote it.
Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.