2012-11-17 10 views
12

मेरी तालिका में नमूना डेटा है और मुझे दो कॉलम में दो टाइमस्टैम्प के बीच व्यवसाय घंटे की गणना करने की आवश्यकता है। बिजनेस बजे: 9:00 बजे से शाम 5:00 बजे और शनिवार और रविवार की उपेक्षा, मैं सार्वजनिक छुट्टियों पर विचार नहीं कर रहा हूं। क्या कोई इसे प्राप्त करने के तरीके पर कुछ दिशानिर्देश प्रदान कर सकता है? मैं वांछित उत्पादन चाहते हैं के रूप में कॉलम 3 में कहा गया है, तिथि के प्रारूप में है: yyyy-mm-ddमाइस्क्ल: दो टाइमस्टैम्प और उपेक्षा सप्ताहांत के बीच व्यापार घंटे की गणना कैसे करें

Created date    Updated date   Business hrs 
    2012-03-05 9:00am 2012-03-05 3:00pm    6 
    2012-03-05 10:00am 2012-03-06 10:00am   9 
    2012-03-09 4:00pm 2012-03-19 10:00am   2 
+0

आपने क्या प्रयास किया? क्या काम नहीं कर रहा है – Yahia

+0

लॉजिक और स्टार्टर्स पर मेरे सिर को खरोंच करना अच्छा होगा – yokoyoko

+0

कुछ शुरुआती बिंदुओं के लिए मेरा उत्तर नीचे देखें ... – Yahia

उत्तर

3

BusinessHours नामक एक मेज, एक एकल स्तंभ घंटे एक तिथि समय युक्त कहा जाता है के साथ बनाएँ। प्राथमिक कुंजी घंटा करें। वर्ष के हर व्यावसायिक घंटे (2012-01-02 00:90:00, 2012-01-02 00:10:00 आदि) के साथ इसे पॉप्युलेट करने के लिए एक प्रक्रिया लिखें। यह कठिन नहीं होना चाहिए क्योंकि नियम सरल हैं। यह बहुत सारे डेटा की तरह लगता है, लेकिन चीजों की भव्य योजना में यह नहीं है (साल में केवल 8760 घंटे हैं - भले ही आपकी तिथि का समय प्रत्येक 8 बाइट लेता है, यह 60 किलोबाइट है)। इसे आबादी रखने के लिए नौकरी निर्धारित करना सुनिश्चित करें।

तब: - बस BusinessHours तालिका से बाहर पंक्तियों ले

Select 
    y.CreatedDate, 
    y.UpdatedDate, 
    Count(*) as BusinessHours 
From 
    YourTable y 
    Inner Join 
    BusinessHours h 
    On h.Hour >= y.CreatedDate And h.Hour < y.UpdatedDate 
Group By 
    y.CreatedDate, 
    y.UpdatedDate 

यह भी आप एक काफी स्पष्ट दृष्टिकोण अगर तुम कभी सार्वजनिक छुट्टियों पर विचार करते हैं देता है।

0

कोशिश

SELECT (FLOOR(DATEDIFF (UpdatedDate, CreatedDate)/7) * 5 + MOD (DATEDIFF (UpdatedDate, CreatedDate), 7)) * 8 + 
     TIMEDIFF (TIME (UpdatedDate), TIME(CreatedDate)) 
FROM YourTable 

ऊपर के रूप में यह केवल "अनुमान" सप्ताहांत पूरा नहीं हुआ है ... लेकिन यह आप शुरू कर दिया ... एक और विकल्प मान्य businesshours की एक तालिका के साथ काम करने के लिए है मिलना चाहिए (के लिए विवरण this answer from Laurence देखें)।

संदर्भ के लिए MySQL documentation देखें।

14

सवाल यह कहता है कि सार्वजनिक छुट्टियों पर विचार नहीं किया जाना चाहिए, इसलिए यह उत्तर केवल यही करता है - सप्ताहांत लेने वाले व्यावसायिक घंटों की गणना करता है, लेकिन संभावित सार्वजनिक छुट्टियों को अनदेखा करता है।

यदि आपको सार्वजनिक छुट्टियों को ध्यान में रखना है तो आपको एक अलग टेबल की आवश्यकता होगी जो सार्वजनिक छुट्टियों के लिए तिथियों की सूची देगी, जो साल-दर-साल और राज्य से राज्य या देश से देश में भिन्न हो सकती हैं। मुख्य सूत्र एक ही रह सकता है, लेकिन आपको तारीखों की दी गई सीमा के भीतर आने वाली सार्वजनिक छुट्टियों के लिए अपने परिणाम घंटों से घटाना होगा।

चलो कुछ नमूना डेटा है कि विभिन्न मामलों को शामिल किया गया के साथ एक मेज बनाएँ:

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 
+0

यह संभावित व्यावसायिक घंटों के लिए काम करेगा, लेकिन छुट्टियों के साथ वास्तविक व्यावसायिक घंटों को वर्ष-दर-साल बदलना स्पष्ट परिभाषा की आवश्यकता होगी , एक मेज में संभावना है। – JRD

+0

@ जेआरडी, आप सही हैं। सवाल स्पष्ट रूप से बताता है कि सार्वजनिक छुट्टियों को नजरअंदाज किया जाना चाहिए और मैंने जवाब में इसे दोहराया नहीं है। मुझे लगता है, मैं बेहतर करूँगा ... –

+2

एक बहुत चालाक समाधान, फिर भी। – JRD

0

उपयोग प्रारंभ और समाप्ति समय के बीच अंतर की गणना और फिर घटाना (नकारात्मक घंटे साथ date_add) करने के लिए गैर काम के घंटे: 24 के लिए सप्ताहांत के दिनों, 16 कार्य दिवसों के लिए अंत और प्रारंभिक दिन की अपेक्षा करता है जिसके लिए अतिरिक्त गणना की आवश्यकता होती है। चाहे कोई दिन सप्ताहांत का दिन हो या नहीं, दिन के तरीके के साथ निर्दिष्ट किया जा सकता है।

संबंधित मुद्दे