Hi Glenn
I'm getting 11 days. The last line of code equates to 5 + 3 + 3 which is 11.
>When I run the code in this message with {^2003/06/06} and {^2003/06/11} I get 4. What do you get? I sure hope 4!
>
>Glenn
>
>>Hi Glenn
>>
>>I did copy your code. I made a typo in the dates I gave you. I used June 6, 2003 to June 11, 2003.
>>
>>
LPARAMETERS dDate1, dDate2
>>LOCAL wks, wkd
>>hd = MAX(ddate1,ddate2)
>>ld = Min(ddate1,ddate2)
>>
>>wks = INT( (hd - ld)/ 7)
>>
>>* Return Weeks * 5 which is overal workdays
>>* Adjust for starting day of the first week
>>* And adjust for the last partial week
>>
>>RETURN ;
>> INT(wks * 5 + ;
>> IIF(DOW(ld,2) < 6, 6-DOW(ld,2),0) + ;
>> IIF(DOW(hd,2) < 6, DOW(hd,2),0) )
>>
>>
>>>You must not have copied my code from this page because with this code I get 4, not 11. I admit 4 is incorrect but I am still debugging. I will post an improved version in a few minutes.
>>>
>>>Thanks for the critique
>>>
>>>Glenn
>>>
>>>C O R R E C T I O N ----
>>>
>>>Fri - Mon - Tue - Wed
>>>
>>> 4 IS correct!
>>>
>>>>Glenn
>>>>
>>>>I see you're trying something like what I posted. I like how you're trying to reduce the code's length. But, given June 11, 2003 and June 6, 2003 your version returns 11 days. Counting the days on the calendar I get 5 days.
>>>>
>>>>The random testing makes it impossible to determine if one routine is faster than another.
>>>>
>>>>>Thanks, here is a newer version which also is based upon weeks but in a different way.
>>>>>
>>>>>LPARAMETERS dDate1, dDate2
>>>>>LOCAL wks, wkd
>>>>>
>>>>>hd = MAX(ddate1,ddate2)
>>>>>ld = Min(ddate1,ddate2)
>>>>>
>>>>>wks = INT( (hd - ld)/ 7)
>>>>>
>>>>>* Return Weeks * 5 which is overal workdays
>>>>>* Adjust for starting day of the first week
>>>>>* And adjust for the last partial week
>>>>>
>>>>>RETURN ;
>>>>> INT(wks * 5 + ;
>>>>> IIF(DOW(ld,2) < 6, 6-DOW(ld,2),0) + ;
>>>>> IIF(DOW(hd,2) < 6, DOW(hd,2),0) )
>>>>>
>>>>>
>>>>>
>>>>>On my computer (AMD 1.6g 256mb) a 100,000 randomized test took 2.031 seconds including the considerable overhead of the test itself.
>>>>>
>>>>>ld = RAND(-1)
>>>>>nStart = SECONDS()
>>>>>FOR i = 1 TO 100000
>>>>> noffset = INT(RAND()* 36)
>>>>> ld = GOMONTH(DATE(),1-noffset)
>>>>> hd = GOMONTH(DATE(),noffset)
>>>>> wkd = workdays(ld,hd)
>>>>>ENDFOR
>>>>>MESSAGEBOX('Execution time was '+TRANSFORM(SECONDS()-nstart)+' seconds')
>>>>>
>>>>>
>>>>>
>>>>>What do you think of this version?
>>>>>
>>>>>Thanks
>>>>>
>>>>>Glenn
>>>>>
>>>>>
>>>>>>Glenn,
>>>>>>
>>>>>>That code will fail if the dates cross a year boundary or are more than a year apart.
>>>>>>
>>>>>>>I needed a solution to determine the number of workdays between two dates and have not been satisfied with the prevalent techniques.