KNOWLEDGE BASE
Log In    |    Knowledge Base    |    4D Home
Tech Tip: Calculating the first and last day of a Week from a Date
PRODUCT: 4D | VERSION: 11.4 | PLATFORM: Mac & Win
Published On: September 10, 2009

Sometimes you need to find information about a week and you only have a date within the week, for example, the current date. The following routine allows you to find the first and last day of the week given a date. The following code assumes that the week begins with Sunday and ends with Saturday.

 `...................................................................  ` Project Method: Util_Calculate_Week  ` Description: return first and last day of week based on a date  ` Parameters: \$1 - Date - date to calculate week start and end for  ` Returns: \$2 - Pointer to Date - First Day of the Week  ` \$3 - Pointer to Date - Last Day of the Week  ` Util_Calculate_Week(current date;->\$thisweekstart;->\$thisweekend)  `...................................................................C_DATE(\$Date_d;\$Date1_d;\$Date2_d)C_INTEGER(\$DayNumber_l)C_DATE(\$1)C_POINTER(\$2;\$3)\$Date_d:=\$1\$DayNumber_l:=Day number(\$1)Case of   : (\$DayNumber_l=1)    \$Date1_d:=\$Date_d    \$Date2_d:=\$Date_d+6  : (\$DayNumber_l=2)    \$Date1_d:=\$Date_d-1    \$Date2_d:=\$Date_d+5  : (\$DayNumber_l=3)    \$Date1_d:=\$Date_d-2    \$Date2_d:=\$Date_d+4  : (\$DayNumber_l=4)    \$Date1_d:=\$Date_d-3    \$Date2_d:=\$Date_d+3  : (\$DayNumber_l=5)    \$Date1_d:=\$Date_d-4    \$Date2_d:=\$Date_d+2  : (\$DayNumber_l=6)    \$Date1_d:=\$Date_d-5    \$Date2_d:=\$Date_d+1  : (\$DayNumber_l=7)    \$Date1_d:=\$Date_d-6    \$Date2_d:=\$Date_dEnd case \$2->:=\$Date1_d\$3->:=\$Date2_d

Commented by Designer on September 18, 2009 at 11:20 AM
Thank you Thomas and J. Buchwitz, the method has been updated.
Many thanks for the optimized routine as well.
Commented by Thomas Maul on September 18, 2009 at 1:21 AM
There is a syntax error in this code, it will not work because:
C_POINTER(vThisWeek1_d;vThisWeek2_d)

As the idea of the code is to return the two dates, I guess best is to change the two last lines to:
\$2->:=\$Date1_d
\$3->:=\$Date2_d
And call the method such as:
Util_Calculate_Week(current date;->\$thisweekfirstday;->\$thisweeklastday)

But the code is too complex, it could be drastically reduced with a simple calculation:
C_DATE(\$1;vThisWeek1_d)
C_POINTER(\$2;\$3)
vThisWeek1_d:=\$1-(Day number(\$1))+1
\$2->:=vThisWeek1_d
\$3->:=vThisWeek1_d+6

The whole code can be reduced to 5 lines...
Thanks to J. Buchwitz, Germany, for reporting this.