WinBatch Tech Support Home

Database Search

If you can't find the information using the categories below, post a question over in our WinBatch Tech Support Forum.

TechHome

Time UDFs

Can't find the information you are looking for here? Then leave a message over on our WinBatch Tech Support Forum.

Week of Month


Question:

What is the easiest way to find out the week number we are currently in? I need the week number for the current month. And it needs to be based on Saturday weekending. That means my answer can be between 1-5 only. At the time of this post, I know we are in week 4 of August. I would like to create a udf for this.

What math formula + date formula to use?

What I need based on this month as an example is:

A udf that gives me the number 1 for 8/1 and 8/2. It will give me the number 2 if the date falls between 8/3 and 8/9. It will give me the number 3 if the date falls between 8/10 and 8/16. Etc etc etc.. based on this month, 8/31 would actually give me the number 1 again because that week's saturday is in the first week of september.

Answer:

Here is my approach to compute the week number within a month on a given date. I assume that a calendarian working week starts at Monday. Give it a try.
#DefineFunction udfWeekOfMonth (sYmdHms) ; returns number, range 1..6
iDay = ItemExtract(3,sYmdHms,":")
iDow = (6 + TimeJulianDay(sYmdHms) - iDay) mod 7
If (iDow==0) Then iDow = 7
iDay = iDay + iDow - 2
Return (1 + (iDay / 7))
#EndFunction


; --- test ---

sYmdHms0 = TimeYmdHms()
iWeekOfMonth0 = udfWeekOfMonth(sYmdHms0)

sYmdHms1 = "2002:12:29:00:00:00"
iWeekOfMonth1 = udfWeekOfMonth(sYmdHms1) ; ==> 5

sYmdHms2 = "2002:12:30:00:00:00"
iWeekOfMonth2 = udfWeekOfMonth(sYmdHms2) ; ==> 6

sYmdHms3 = "2003:01:05:00:00:00"
iWeekOfMonth3 = udfWeekOfMonth(sYmdHms3) ; ==> 1

sYmdHms4 = "2003:01:06:00:00:00"
iWeekOfMonth4 = udfWeekOfMonth(sYmdHms4) ; ==> 2

sYmdHms5 = "2003:01:07:00:00:00"
iWeekOfMonth5 = udfWeekOfMonth(sYmdHms5) ; ==> 2

sYmdHms6 = "2003:08:01:00:00:00"
iWeekOfMonth6 = udfWeekOfMonth(sYmdHms6) ; ==> 1

sYmdHms7 = "2003:08:17:00:00:00"
iWeekOfMonth7 = udfWeekOfMonth(sYmdHms7) ; ==> 3

sYmdHms8 = "2003:08:18:00:00:00"
iWeekOfMonth8 = udfWeekOfMonth(sYmdHms8) ; ==> 4

sYmdHms9 = "2003:08:25:00:00:00"
iWeekOfMonth9 = udfWeekOfMonth(sYmdHms9) ; ==> 5

sYmdHms10 = "2004:05:01:00:00:00"
iWeekOfMonth10 = udfWeekOfMonth(sYmdHms10) ; ==> 1

sYmdHms11 = "2004:05:02:00:00:00"
iWeekOfMonth11 = udfWeekOfMonth(sYmdHms11) ; ==> 1

sYmdHms12 = "2004:05:03:00:00:00"
iWeekOfMonth12 = udfWeekOfMonth(sYmdHms12) ; ==> 2

sYmdHms13 = "2004:05:30:00:00:00"
iWeekOfMonth13 = udfWeekOfMonth(sYmdHms13) ; ==> 5

sYmdHms14 = "2004:05:31:00:00:00"
iWeekOfMonth14 = udfWeekOfMonth(sYmdHms14) ; ==> 6

sYmdHms15 = "2004:02:29:00:00:00"
iWeekOfMonth15 = udfWeekOfMonth(sYmdHms15) ; ==> 5

sYmdHms16 = "2013:08:19:00:00:00"
iWeekOfMonth16 = udfWeekOfMonth(sYmdHms16) ; ==> 4

sYmdHms17 = "2013:12:30:00:00:00"
iWeekOfMonth17 = udfWeekOfMonth(sYmdHms17) ; ==> 6

Exit


Here comes another approach that respects the week beginning with Sunday or Monday. And a small test demo included.


;------------------------------------------------------------------------------------------------------------------------------------------
#DefineFunction udfWeekOfYear (sYmdHms) ; returns number, range 0..53
iJulianNow     = TimeJulianDay(sYmdHms)
iJulianJan4    = TimeJulianDay(StrCat(ItemExtract(1,sYmdHms,":"),":01:04:00:00:00"))
iJulianDowJan4 = (iJulianJan4+5) mod 7 ; Range=0..6 = Sunday..Saturday
iJulianMonday  = 1+iJulianJan4-iJulianDowJan4-(7*!iJulianDowJan4)
iWeek          = (iJulianNow-iJulianMonday)/7
iWeek          = iWeek+(iJulianNow>=iJulianMonday)
Return (iWeek)
#EndFunction
;------------------------------------------------------------------------------------------------------------------------------------------


;------------------------------------------------------------------------------------------------------------------------------------------
#DefineFunction udfYmdHmsToYwd (sYmdHms, iMode)
iJulianNow = TimeJulianDay(sYmdHms)
iJulianDowNow = (iJulianNow + 5) mod 7                         ; Number of the day. Range=0..6 = Sunday..Saturday.
If iJulianDowNow Then iJulianNow = 7+iJulianNow-iJulianDowNow  ; Next Sunday ends the Calendar week.
sYmdHms = TimeJulToYmd(iJulianNow)
sWeekOfYear = StrFixLeft(udfWeekOfYear(sYmdHms),"0",2)         ; This is our week number.
sYear = ItemExtract(1,sYmdHms,":")                             ; Maybe already next year.
If Min(1,Max(0,iMode))
   If !iJulianDowNow Then iJulianDowNow = 7                    ; Make the Julian Sunday the last day in a Calendar week.
   sYwd = StrCat(sYear,"W",sWeekOfYear,iJulianDowNow)
Else
   sYwd = StrCat(sYear,"W",sWeekOfYear)
EndIf
Return (sYwd)
;..........................................................................................................................................
; This Function "udfYmdHmsToYwd" returns ISO 8601 standard notation
; for the given YmdHms datetime string in a formatted string like "yyyyWwwd".
; For example, the first week of the year 1997 lasts from 1996-12-30 to 1997-01-05 and
; can be written in standard notation as "1997W01",
; and "1996:12:31" becomes "1997W012".
; iMode=0 ... Format "yyyyWww"
; iMode=1 ... Format "yyyyWwwd" ; appends the calendarian number of the day of the week, with d=1..7 = Monday..Sunday.
;
; Detlev Dalitz.20020722
;..........................................................................................................................................
#EndFunction
;------------------------------------------------------------------------------------------------------------------------------------------


;------------------------------------------------------------------------------------------------------------------------------------------
#DefineFunction udfWeekOfMonth (sYmdHms, iMode)
iDay = ItemExtract(3,sYmdHms,":")
iDow = (7 + TimeJulianDay(sYmdHms) - iDay - iMode) mod 7
If (iDow==0) Then iDow = 7
iDay = iDay + iDow - 2
Return (1 + (iDay / 7))
;..........................................................................................................................................
; This function udfWeekOfMonth returns the number of the week within the month
; that is given by the first parameter sYmdHms datetime string.
; This function returns a number in range 1..6.
;
; The second parameter iMode controls whether a week begins with Sunday or Monday.
; iMode = 0 ... Week begins with Sunday.
; iMode = 1 ... Week begins with Monday.
;
; Detlev Dalitz.20030819
;..........................................................................................................................................
#EndFunction
;------------------------------------------------------------------------------------------------------------------------------------------


; --- test ---

:test1
iWeekOfMonth0 = udfWeekOfMonth(TimeYmdHms(),0)
iWeekOfMonth1 = udfWeekOfMonth(TimeYmdHms(),1)


:test2
BoxOpen("","")
sOut = ""

iStart = TimeJulianDay("2000:01:01:00:00:00")
iStop  = TimeJulianDay("2006:01:01:00:00:00")

For iDay=iStart To iStop
   sYmdHms = TimeJulToYmd(iDay)
   sDay = ItemExtract(1+((iDay+5) mod 7),"Sun,Mon,Tue,Wed,Thu,Fri,Sat",",")

   iWoMSun = udfWeekOfMonth(sYmdHms,0) ; Week begins with Sunday.
   iWoMMon = udfWeekOfMonth(sYmdHms,1) ; Week begins with Monday.

   sYwd = udfYmdHmsToYwd(sYmdHms,1)

   sLine = StrCat(sYmdHms,"  ",sDay,"  ",iWoMSun,"  ",iWoMMon,"  ",sYwd,@CRLF)
   If (1==(0+ItemExtract(3,sYmdHms,":"))) Then sOut = StrCat(sOut,@CRLF)
   sOut = StrCat(sOut,sLine)

   BoxText(sLine)
Next
BoxShut()

sFilename = StrCat(Environment("temp"),"\out.txt")
FilePut(sFilename,sOut)
Run(sFilename,"")
Exit
;------------------------------------------------------------------------------------------------------------------------------------------

Article ID:   W16258
File Created: 2004:03:30:15:43:36
Last Updated: 2004:03:30:15:43:36