Search code examples
crystal-reportsisocrystal-reports-xiweek-number

Correct ISO week numbering in Crystal Reports XI


How can I get the ISO-8601 week number of a given date in Crystal Reports XI?


Solution

  • Crystal Reports supports the DatePart-function which can give you the ISO week number of a given date.

    NumberVar week := DatePart("ww", date, crMonday, crFirstFourDays);
    

    However, in Crystal Reports XI there is a bug that gives erronous results round new year. The best solution is probably to create an own function getISOWeekNumber:

    Function (optional DateVar d := CurrentDate)
    NumberVar week := DatePart("ww", d, crMonday, crFirstFourDays);
    
    // Correct for that CR doesn't handle the fact that the last days of a year can belong to week 1 of the next year:
    if week = 53 and DatePart("ww", cDate(year(d) + 1, 1, 1), crMonday, crFirstFourDays) = 1 then
        week := 1
    
    // A bug in CR makes DatePart return values like 9363 for days in January that belongs to the last week of the previous year.
    else if week > 53 then
        week := DatePart("ww", cDate(year(d) - 1, 12, 31), crMonday, crFirstFourDays);
    
    week;
    

    To get the "week-year" of a specific date, you could then use the following function:

    // Returns the year to which the ISO week of the specified date belongs.
    // E.g. 2012-12-31 will return 2013, as that date belongs to week 1 of 2013.
    Function (optional DateVar d := CurrentDate)
    
    NumberVar week := getISOWeekNumber (d);
    
    if week = 1 and month(d) = 12 then
        year(d) + 1
    else if week > 10 and month(d) = 1 then
        year(d) - 1
    else
        year(d);