Can't find the information you are looking for here? Then leave a message over on our WinBatch Tech Support Forum.
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.
#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: W16258File Created: 2004:03:30:15:43:36Last Updated: 2004:03:30:15:43:36