सवाल यह कहता है कि सार्वजनिक छुट्टियों पर विचार नहीं किया जाना चाहिए, इसलिए यह उत्तर केवल यही करता है - सप्ताहांत लेने वाले व्यावसायिक घंटों की गणना करता है, लेकिन संभावित सार्वजनिक छुट्टियों को अनदेखा करता है।
यदि आपको सार्वजनिक छुट्टियों को ध्यान में रखना है तो आपको एक अलग टेबल की आवश्यकता होगी जो सार्वजनिक छुट्टियों के लिए तिथियों की सूची देगी, जो साल-दर-साल और राज्य से राज्य या देश से देश में भिन्न हो सकती हैं। मुख्य सूत्र एक ही रह सकता है, लेकिन आपको तारीखों की दी गई सीमा के भीतर आने वाली सार्वजनिक छुट्टियों के लिए अपने परिणाम घंटों से घटाना होगा।
चलो कुछ नमूना डेटा है कि विभिन्न मामलों को शामिल किया गया के साथ एक मेज बनाएँ:
SELECT
CreatedDate,
UpdatedDate,
DATEDIFF(minute, CreatedDate, UpdatedDate)/60.0 -
DATEDIFF(day, CreatedDate, UpdatedDate)*16 -
DATEDIFF(week, CreatedDate, UpdatedDate)*16 AS BusinessHours
FROM T
निम्नलिखित में से कौन परिणाम पैदा करता है:
CREATE TABLE T (CreatedDate datetime, UpdatedDate datetime);
INSERT INTO T VALUES
('2012-03-05 09:00:00', '2012-03-05 15:00:00'), -- simple part of the same day
('2012-03-05 10:00:00', '2012-03-06 10:00:00'), -- full day across the midnight
('2012-03-05 11:00:00', '2012-03-06 10:00:00'), -- less than a day across the midnight
('2012-03-05 10:00:00', '2012-03-06 15:00:00'), -- more than a day across the midnight
('2012-03-09 16:00:00', '2012-03-12 10:00:00'), -- over the weekend, less than 7 days
('2012-03-06 16:00:00', '2012-03-15 10:00:00'), -- over the weekend, more than 7 days
('2012-03-09 16:00:00', '2012-03-19 10:00:00'); -- over two weekends
एमएस एसक्यूएल सर्वर में मैं निम्न सूत्र का उपयोग
+-------------------------+-------------------------+---------------+
| CreatedDate | UpdatedDate | BusinessHours |
+-------------------------+-------------------------+---------------+
| 2012-03-05 09:00:00 | 2012-03-05 15:00:00 | 6 |
| 2012-03-05 10:00:00 | 2012-03-06 10:00:00 | 8 |
| 2012-03-05 11:00:00 | 2012-03-06 10:00:00 | 7 |
| 2012-03-05 10:00:00 | 2012-03-06 15:00:00 | 13 |
| 2012-03-09 16:00:00 | 2012-03-12 10:00:00 | 2 |
| 2012-03-06 16:00:00 | 2012-03-15 10:00:00 | 50 |
| 2012-03-09 16:00:00 | 2012-03-19 10:00:00 | 42 |
+-------------------------+-------------------------+---------------+
यह काम करता है, क्योंकि SQL सर्वर DATEDIFF
में गणना की जाती है निर्दिष्ट datepart निर्दिष्ट स्टार्टडेट और समाप्ति के बीच सीमा पार हो गई।
प्रत्येक दिन 8 व्यावसायिक घंटे होते हैं। मैं दो तिथियों के बीच घंटों की कुल संख्या की गणना करता हूं, फिर प्रति दिन 16 गैर-व्यावसायिक घंटे गुणा करके मध्यरात्रि की संख्या घटाता हूं, फिर सप्ताहांत की संख्या घटाकर 16 (8 + 8 व्यावसायिक घंटे शनि + सूर्य के लिए) घटाता है।
यह भी मानता है कि दी गई शुरुआत और समाप्ति तिथि/समय व्यवसाय के घंटों के दौरान होती है।
MySQL में निकटतम समतुल्य TIMESTAMPDIFF
है, लेकिन यह अलग-अलग काम करता है। यह इकाई में सेकंड की संख्या से सेकेंड में अंतर को विभाजित करता है और विभाजित करता है (आंशिक भाग को छोड़कर)।
तो, परिणाम है कि हम की जरूरत है हम CreatedDate
और UpdatedDate
सीधे के बीच अंतर की गणना के बजाय कुछ लंगर datetime और CreatedDate
और UpdatedDate
के बीच TIMESTAMPDIFF
गणना कर सकते हैं पाने के लिए।
मैंने 2000-01-03 00:00:00
चुना है, जो सोमवार है। एंकर तिथि के लिए आप आधी रात (या रविवार, अगर आपका सप्ताह रविवार को शुरू होता है) चुन सकते हैं।
MySQL क्वेरी हो जाता है (SQL Fiddle देखें): DateDiff
SELECT
CreatedDate,
UpdatedDate,
TIMESTAMPDIFF(MINUTE, CreatedDate, UpdatedDate)/60.0 -
16*(
TIMESTAMPDIFF(DAY, '2000-01-03',UpdatedDate)-
TIMESTAMPDIFF(DAY, '2000-01-03',CreatedDate)
) -
16*(
TIMESTAMPDIFF(WEEK, '2000-01-03',UpdatedDate)-
TIMESTAMPDIFF(WEEK, '2000-01-03',CreatedDate)
) AS BusinessHours
FROM T
आपने क्या प्रयास किया? क्या काम नहीं कर रहा है – Yahia
लॉजिक और स्टार्टर्स पर मेरे सिर को खरोंच करना अच्छा होगा – yokoyoko
कुछ शुरुआती बिंदुओं के लिए मेरा उत्तर नीचे देखें ... – Yahia