Hi mahesh213,
Refer below query.
SQL
CREATE TABLE #Test(Id INT,Name CHAR(1),logInTime DATETIME,Logouttime DATETIME)
INSERT INTO #Test VALUES(1,'a','6-3-2020 09:45:12','6-3-2020 12:23:34')
INSERT INTO #Test VALUES(1,'a','6-3-2020 14:10:45','6-3-2020 18:34:20')
INSERT INTO #Test VALUES(1,'a','6-5-2020 10:20:13','6-5-2020 13:23:45')
INSERT INTO #Test VALUES(1,'a','6-5-2020 14:12:13','6-5-2020 14:47:10')
DECLARE @From DATE, @To DATE
SET @From = '6-1-2020'
SET @To = '6-7-2020'
CREATE TABLE #Date (Id INT,Date DATE,Name CHAR(1),Status VARCHAR(10))
WHILE (@From <= @To)
BEGIN
IF EXISTS(SELECT * FROM #Test WHERE CONVERT(DATE,logInTime) = CONVERT(DATE,@From))
BEGIN
INSERT INTO #Date
SELECT Id,
CONVERT(DATE,logInTime),
Name,
CASE WHEN SUM(DATEDIFF(SECOND,logInTime,Logouttime)) / 60 / 60 / 5 > 0 THEN 'Present'
ELSE 'Absent'
END 'Status'
FROM #Test
WHERE CONVERT(DATE,logInTime) = CONVERT(DATE,@From)
GROUP BY Id,Name,CONVERT(DATE,logInTime)
END
ELSE
BEGIN
DECLARE @Status VARCHAR(10)
IF DATENAME(WEEKDAY, @From) = 'SATURDAY' OR DATENAME(WEEKDAY, @From) = 'SUNDAY'
SET @Status = 'Week Off'
ELSE
SET @Status = 'Absent'
DECLARE @Id INT, @Name CHAR(1)
SELECT @Id = Id, @Name = Name FROM #Test
INSERT INTO #Date VALUES(@Id,@From,@Name,@Status)
END
SET @From = DATEADD(DAY, 1, @From)
END
SELECT * FROM #Date
DROP TABLE #Test
DROP TABLE #Date
Output
Id |
Date |
Name |
Status |
1 |
2020-06-01 |
a |
Absent |
1 |
2020-06-02 |
a |
Absent |
1 |
2020-06-03 |
a |
Present |
1 |
2020-06-04 |
a |
Absent |
1 |
2020-06-05 |
a |
Absent |
1 |
2020-06-06 |
a |
Week Off |
1 |
2020-06-07 |
a |
Week Off |