SELECT StIn.CardNo ,StIn.IODate ,dbo.fnSecondsToTime(DateDiff(ss,MIN(StIn.IOTime), MAX(StOut.IOTime))) as TotalHours ,dbo.fnSecondsToTime(SUM(dbo.fnTimeToSeconds(StOut.IOTime)) - SUM(dbo.fnTimeToSeconds(StIn.IOTime))) as InofficeFROM stagingINOUT StIn, stagingINOUT StOutWHERE StIn.IOTypeN = 12 AND StOut.IOTypeN = 11 AND StIn.CardNo = StOut.CardNoGROUP BY StIn.CardNo, StIn.IODateORDER BY CardNo ,IODate
CREATE FUNCTION fnSecondsToTime (@TotalSeconds int)RETURNS varchar(8)ASBEGIN RETURN (SELECT CONVERT(char(8), DATEADD(second, convert(int,@TotalSeconds), '19000101'), 108))END GOCREATE FUNCTION fnTimeToSeconds (@TimeToConvert time)RETURNS intASBEGIN RETURN (SELECT (DATEPART(hour, @TimeToConvert) * 3600) +(DATEPART(minute, @TimeToConvert) * 60) + DATEPART(second, @TimeToConvert))END GO