Skip to main content
hic
Former Employee
Former Employee

Week numbers are often used in calendars, although not as commonly in some countries as in others. In northern Europe, it is very common to refer to a week by its number, but in many other countries it is not used at all. Just as with the week start, week numbers are defined differently depending on country, so you may need to add code in QlikView to generate your own week numbers.

 

So, how do you count the weeks? Is Jan 1st always part of week one? Not necessarily.

 

If week 53 starts as late as Dec 28th, does Jan 1st also belong to week 53? Sometimes, yes.

 

There is a definition made by the International Organization for Standardization (ISO 8601) that QlikView uses to calculate week numbers. It states that

  1. The week starts on a Monday.
  2. A week is always unbroken.
    I.e. some years week 1 starts already in December, and in other years week 52 or 53 continues into January.
  3. Week 1 always contains Jan 4th.
    Or, differently put: Week 1 always has at least 4 days in January. A third way to say the same thing is: The first Thursday of the year always lies in week 1.

 

These three bullets define the three parameters you need to define general week numbers:

 

     Set vCal_FD = 0; // First Day of the week {0=Mon, 1=Tue, ... , 6=Sun}
     Set vCal_BW = 0; // Broken Weeks allowed {0=No, 1=Yes}
     Set vCal_RD = 4; // Reference day = This day in Jan defines week one {1..7}

 

How the week start - the first parameter - influences the week number can be seen in the following table. It shows how the week number would change for the days around New Year 2013 if different week starts are used. The other parameters are kept constant.

 

Table x04.png

 

The second parameter concerns whether or not broken weeks should be used. If they are, a new week number will always be used on Jan 1st, and as a consequence the first and last weeks of the year can have less than 7 days.

 

Table 6x4.png

 

And finally, the third parameter, the reference day. It defines which day that always belongs to week 1. In the table below, the reference day is 4; hence Jan 4th always belongs to week 1, which can be clearly seen. This number also defines the minimal number of days of week 1 that fall in the new year.

 

Table 604.png

 

The ISO standard is thus a 0/0/4 week numbering. In countries where Sunday is used as first day of the week, I have seen several different variants: 6/1/1, 6/0/3 and 6/0/4.

 

If you copy the above parameters to your QlikView script and the following lines to your Master Calendar definition, you can redefine the week numbers any way you want:

 

     Load *,
          Div( Date - WeekStart( WeekYearRefDate, 0, $(vCal_FD) ) + 7, 7 ) as WeekNumber,
          Year( WeekYearRefDate ) as WeekYear;
     Load *,
          Date( YearStart( If( $(vCal_BW), Date, WeekRefDate )) + $(vCal_RD) - 1) as WeekYearRefDate ;
     Load *,
          Date( WeekStart( Date, 1, $(vCal_FD) ) - $(vCal_RD) ) as WeekRefDate ;

 

The fields WeekYearRefDate (Jan 4th in the ISO definition) and WeekRefDate (the Thursday of the week in the ISO definition) are really not necessary, but the expressions become somewhat simpler if these are used.

 

Until we get a general week numbering functionality built into the QlikView standard functions (and, yes, we are looking into this) you will have to redefine the week numbers using the above script. Good luck!

 

HIC

 

Further reading related to this topic:

Ancient Gods and Modern Days

Redefining the Week Start

Redefining the Week Start in Qlik Sense

Qlik Sense – Date & Time

43 Comments
cpiocpio
Partner - Creator
Partner - Creator

Hi

How do I deal with this scenario

Where Week1 is : Sundays, in June:

03/06/2012
02/06/2013
01/06/2014

Note: the week start on a Sunday also, so using

vCar_FD = 6;  // 6 being sunday

(DateNum,0,$(vCar_FD)) as [W/C],

(DateNum,0,$(vCar_FD)) as [W/E], //change week End to Saturday

0 Likes
4,581 Views
Not applicable

This was most helpful.  Feel fortunate to have not dealt with this issue before this fairly recent post was created.  However, is your script upside-down?  Also, script newbies might get confused with your use of 'Date' since it's a fairly common key word.  This is what wound up working for me.

JOIN (yourCalendar)

     Load *, Date( WeekStart( yourDate, 1, $(vCal_FD) ) - $(vCal_RD) ) as WeekRefDate

Resident yourCalendar;

JOIN (yourCalendar)

     Load *, Date( YearStart( If( $(vCal_BW), yourDate, WeekRefDate )) + $(vCal_RD) - 1) as WeekYearRefDate

Resident yourCalendar;

JOIN (yourCalendar)

     Load *, Div( yourDate- WeekStart( WeekYearRefDate, 0, $(vCal_FD) ) + 7, 7 ) as WeekNumber,

          Year( WeekYearRefDate ) as WeekYear

Resident yourCalendar;

0 Likes
4,581 Views
hic
Former Employee
Former Employee

Yes, you could say that my script is upside-down. On purpose.

I believe that you at almost any price should avoid joins in the script, because they easily introduce errors by duplicating records that shouldn't be duplicated. There is however an alternative, much better solution: Preceding Load. But then it looks as if the script is upside-down.

Read more here: http://community.qlik.com/blogs/qlikviewdesignblog/2013/03/04/preceding-load

HIC

0 Likes
4,581 Views
Not applicable

Is it just me or the weekNumber is returning very funny figures. Please help.

0 Likes
4,581 Views
Not applicable

hello thx Henric,

but how to change the parameter if i want  week 1 is first monday in April?

Many thx

0 Likes
4,610 Views
Not applicable

How would you counteract the effect though of a leap year? So if you needed your week 1 to start on the 1st of March this would fall on a different day number dependent on whether or not the year is a leap year or not...is it better then to count backwards and use a negative number in that case?

0 Likes
4,610 Views
hic
Former Employee
Former Employee

Well spotted.

The above calculations will work as long as the reference day refers to days from New Year's eve. So if you set it to 60, March 1st will belong to week one - but only for non-leap years... For leap years it will usually work, but not always.

But there is a solution: Introduce a fourth parameter: A month offset for fiscal years. Basically this would be the same as described in my previous blog post Fiscal Year.

Bottom line: This blog post describes Calendar year + Week numbers.

The previous blog post about Fiscal Year describes Fiscal year + Month number.

For the combination Fiscal Year + Week number, I need to write a third blog post describing how to modify the above formulae using the forth parameter. Maybe I'll do that...

HIC

4,610 Views
Not applicable

Paul,

It's useful when you are tracking something on weekly basis. Like we track that couriers (from branches to Head Office of the company) are not sent more than twice in a week unless urgently required.

0 Likes
4,610 Views
Not applicable

Thanks Henric .. made my day

0 Likes
4,610 Views
jenmclean
Contributor III
Contributor III

When I try to divide into 13 pay periods, PP13 shows the whole year and it generates a PP14.

PP13 goes from year to year so not sure how to incorporate the Broken Year variable.

The rest of my script is working correctly.

Thoughts?

Load *,
Div( Date - WeekStart( WeekYearRefDate, 0, $(vCal_FD) ) + 7, 7 ) as WeekNumber,
'PP' &
ceil(Div( Date - WeekStart( WeekYearRefDate, 0, $(vCal_FD) ) + 7, 7 ) / 4) AS Period,
// If( $(vCal_BW), Date, WeekRefDate ), 'PP' & ceil(Div(Date - WeekStart( WeekYearRefDate, 0, $(vCal_FD) )+ 7, 7 )/4) AS Period,
Year( WeekYearRefDate ) as WeekYear;
Load *,
Date( YearStart( If( $(vCal_BW), Date, WeekRefDate )) + $(vCal_RD) - 1) as WeekYearRefDate ;
Load *,
Date( WeekStart( Date, 1, $(vCal_FD) ) - $(vCal_RD) ) as WeekRefDate ;

0 Likes
4,610 Views