2013-02-13 17 views
11

मुझे दो दी गई तिथियों के बीच व्यावसायिक दिनों (कार्य दिवस) की गिनती की गणना करने की आवश्यकता है। शनिवार और रविवार को छोड़कर सप्ताह के सभी दिन सप्ताह के होते हैं। मैं इस गिनती में छुट्टियों पर विचार नहीं कर रहा हूं।दो तिथियों के बीच व्यावसायिक दिनों की गिनती की गणना कैसे करें?

दो तिथियों के बीच व्यावसायिक दिनों की गिनती की गणना कैसे करें?

उत्तर

8

आपको DayOfTheWeek (DateUtils इकाई से) और काउंटर का उपयोग करने की आवश्यकता है, जो आरंभिक तिथि से लेकर अंतिम तिथि तक चलती है। (आप भी शायद छुट्टियों की एक मेज, अपने गिनती से उन भी निकालना होगा।)

function BusinessDaysBetween(const StartDate, EndDate: TDateTime): Integer; 
var 
    CurrDate : TDateTime; 
begin 
    CurrDate := StartDate; 
    Result := 0; 
    while (CurrDate <= EndDate) do 
    begin 
    // DayOfTheWeek returns 1-5 for Mon-Fri, so 6 and 7 are weekends 
    if DayOfTheWeek(CurrDate) < 6 then 
     Inc(Result); 
    CurrDate := CurrDate + 1; 
    end; 
end; 

आप (मापदंडों के आदेश दूसरे शब्दों में के बारे में चिंता नहीं करने से इस एक छोटे से वृद्धि कर सकते हैं, यह नहीं करता है सभी दिनों और इनपुट पैरामीटर आदेश के आधार पर नहीं पाशन के बिना

function BusinessDaysBetween(const FirstDate, SecondDate: TDateTime): Integer; 
var 
    CurrDate : TDateTime; 
    StartDate, EndDate: TDateTime; 
begin 
    if SecondDate > FirstDate then 
    begin 
    StartDate := FirstDate; 
    EndDate := SecondDate; 
    end 
    else 
    begin 
    StartDate := SecondDate; 
    EndDate := FirstDate; 
    end; 

    CurrDate := StartDate; 
    Result := 0; 

    while (CurrDate <= EndDate) do 
    begin 
    if DayOfTheWeek(CurrDate) < 6 then 
     Inc(Result); 
    CurrDate := CurrDate + 1; 
    end; 
end; 
+0

मैं आपको धन्यवाद देता हूं ... मुझे छुट्टियों की आवश्यकता नहीं है क्योंकि वे बदलाव के समय को महत्वपूर्ण रूप से प्रभावित नहीं करेंगे .. लेकिन सप्ताहांत समस्याएं हैं। मैं इसे एक शॉट दूँगा। – Sardukar

+0

मैंने लगभग एक ही समारोह का उपयोग किया .. बहुत अच्छा काम करता है। ऐसे तरीके भी नमूने हो सकते हैं ताकि अगर छुट्टियों के साथ कुछ समस्याएं हों तो वे समग्र रूप से प्रभावित नहीं होंगे .. धन्यवाद। – Sardukar

+7

लूप के बिना ऐसा करना अच्छा होगा। –

12

: 'टी बात करता है, तो शुरू होने से पहले अंत या अंत शुरू होने से पहले है, समारोह अभी भी काम करेगा)।

Uses DateUtils,Math; 

function WorkingDaysBetween(const firstDate,secondDate : TDateTime) : Integer; 
var 
    startDate,stopDate : TDateTime; 
    startDow,stopDow : Integer; 
begin 
    if (firstDate < secondDate) then 
    begin 
    startDate := firstDate; 
    stopDate := secondDate; 
    end 
    else 
    begin 
    startDate := secondDate; 
    stopDate := firstDate; 
    end; 
    startDow := DayOfTheWeek(startDate); 
    stopDow := DayOfTheWeek(stopDate); 
    if (stopDow >= startDow) then 
    stopDow := Min(stopDow,6) 
    else 
    Inc(stopDow,5); 

    Result := 
    5*WeeksBetween(stopDate,startDate) + 
    (stopDow - Min(startDow,6)); 
end; 
+3

+1। अच्छा! मुझे एक गैर-लूपिंग समाधान देखने का मौका नहीं मिला - अब मुझे निश्चित रूप से ऐसा करने की आवश्यकता नहीं है। :-) –

+4

मुझे आपके फ़ंक्शन के साथ, अन्य दो से अलग-अलग परिणाम मिलते हैं, यदि मैं 'dt1: = Now' और' dt2: = incYear (Now, 3) 'का परीक्षण करता हूं। – kobik

+5

@ कोबिक, धन्यवाद। सही दिन क्रमांकन समारोह निश्चित रूप से 'DayOfTheWeek() 'है। –

13
function BusinessDaysSinceFixedDate (const nDate : tDateTime) : integer; 
const 
    Map : array [ -6 .. 6 ] of integer 
     = ( 0, 0, 1, 2, 3, 4, 5, 5, 5, 6, 7, 8, 9); 
var 
    X : integer; 
begin 
    X := trunc (nDate); 
    Result := 5 * (X div 7) + Map [ X mod 7 ]; 
end; 

function BusinessDaysBetweenDates (const nStartDate : tDateTime; 
            const nEndDate : tDateTime) : integer; 
begin 
    Result := BusinessDaysSinceFixedDate (nEndDate) 
      - BusinessDaysSinceFixedDate (nStartDate); 
end; 

दिनचर्या BusinessDaysSinceFixedDate एक निश्चित तिथि के बाद से व्यापार के दिनों की गणना। विशिष्ट तारीख, जो अप्रासंगिक है, सोमवार, 25 दिसंबर, 18 99 है। यह बस पारित होने वाले हफ्तों की संख्या (एक्स div 7) की गणना करता है और यह दर्शाता है कि 5. फिर यह दिन के आधार पर सही करने के लिए ऑफसेट जोड़ता है सप्ताह का। ध्यान दें कि (एक्स आधुनिक 7) एक नकारात्मक तारीख के लिए नकारात्मक मान वापस आ जाएगी, 30 दिसंबर से पहले अर्थात एक तिथि, 1899

दिनचर्या BusinessDaysBetweenDates बस आरंभ और समाप्ति तिथि के लिए BusinessDaysSinceFixedDate कॉल करता है और दूसरे से घटा देती है।

+4

+1। आप 'BusinessDaysBetweenDates' के परिणाम में' Abs' जोड़ सकते हैं (इसलिए दिन का परिणाम हमेशा सकारात्मक होगा)। – kobik

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

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