यह मानते हुए कि प्रत्येक विराम और अंत के लिए हमेशा एक शुरुआत होती है, क्या ऐसा कुछ अधिक प्रत्यक्ष नहीं होगा?
SELECT t.task
, SUM(TO_SECONDS(t.stime)
* CASE WHEN t.status IN (1) THEN -1
WHEN t.status IN (2, 3) THEN 1
ELSE 0
END
) AS totalTimeSecs
FROM tblwork AS task
GROUP BY t.task
मुझे पूरा यकीन नहीं है कि TO_SECONDS() से निकलने वाले मान वर्तमान टाइमस्टैम्प के लिए कितने बड़े हैं; लेकिन अगर उन्हें सारांशित करते समय कोई समस्या है, तो उन्हें
. में बदला जा सकता है , SUM((TO_SECONDS(t.stime) - some_constant_just_before_or_at_your_earliest_seconds)
* CASE WHEN t.status IN (1) THEN -1
WHEN t.status IN (2, 3) THEN 1
ELSE 0
END
) AS totalTimeSecs
आप चुनिंदा एक्सप्रेशन सूची में निम्नलिखित जोड़कर "असामान्य" डेटा का पता लगा सकते हैं
, CASE WHEN SUM(CASE
WHEN t.status IN (1) THEN -1
WHEN t.status IN (2, 3) THEN 1
ELSE 0 END
) = 0
THEN 'OK'
ELSE 'ABNORMAL'
END AS integrityCheck
नोट:किसी भी "अनक्लोज्ड" अंतराल को असामान्य के रूप में चिह्नित किया जाएगा; "अमान्य" से "खुले" को अलग करने के लिए अंतराल के लिए अधिक जटिल और महंगी शुरुआत और अंत जांच के बिना, शायद यह सबसे अच्छा किया जा सकता है। एडिटोनल "इंटीग्रिटीचेक" बराबर -1 के लिए उपयोग की जाने वाली राशि एक ओपन एंडेड अंतराल पर संकेत दे सकती है, लेकिन यह गलत डबल-स्टार्ट का संकेत भी दे सकती है।