आप ऐसा कुछ कर सकते हैं
SELECT empno, date_created, time_in, time_out,
CASE WHEN total_hours - 8 > 0 THEN total_hours - 8 ELSE 0 END overtime
FROM
(
SELECT empno, date_created, time_in, time_out,
TIME_TO_SEC(TIMEDIFF(COALESCE(time_out, '17:00:00'),
COALESCE(time_in, '09:00:00'))) / 3600 total_hours
FROM
(
SELECT empno, date_created,
MIN(CASE WHEN status = 0 THEN time_created END) time_in,
MIN(CASE WHEN status = 1 THEN time_created END) time_out
FROM biometrics
GROUP BY empno, date_created
) a
) b
यह रहा SQLFiddle डेमो
आपको time_in
. के लिए वास्तविक डिफ़ॉल्ट मान प्रदान करने की आवश्यकता है और time_out
ऐसे मामलों के लिए जब वे NULL
. हों . चरम स्थिति में यदि NULL
s इस तथ्य के कारण होते हैं कि कर्मचारी एक दिन आते हैं और दूसरे दिन घर जाते हैं, वे डिफ़ॉल्ट मान 00:00:00
हो सकते हैं और 23:59:59
क्रमशः चूंकि आप प्रति कैलेंडर दिन ओवरटाइम की गणना कर रहे हैं।
अपडेट करें: अगर आप overtime
चाहते हैं समय प्रारूप में प्रस्तुत किया जाना है
SELECT empno, date_created, time_in, time_out,
SEC_TO_TIME(
CASE WHEN total_sec - 28800 > 0
THEN total_sec - 28800
ELSE 0 END) overtime
FROM
(
SELECT empno, date_created, time_in, time_out,
TIME_TO_SEC(TIMEDIFF(COALESCE(time_out, '17:00:00'),
COALESCE(time_in, '09:00:00'))) total_sec
FROM
(
SELECT empno, date_created,
MIN(CASE WHEN status = 0 THEN time_created END) time_in,
MIN(CASE WHEN status = 1 THEN time_created END) time_out
FROM biometrics
GROUP BY empno, date_created
) a
) b
यह रहा SQLFiddle डेमो