Changeset: fdd09b97b50b for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fdd09b97b50b Modified Files: monetdb5/modules/atoms/mtime.c Branch: Feb2013 Log Message:
Properly extract week number from a given date. Note that if Jan 1 is not on a Monday, it is in the same week as Dec 31 of the year before, and this can be either week 1 (if Jan 1 is on a Tuesday, Wednesday, or Thursday) of week 52/53 (if it is on a Friday, Saturday, or Sunday). This fixes bug 3232 properly. diffs (44 lines): diff --git a/monetdb5/modules/atoms/mtime.c b/monetdb5/modules/atoms/mtime.c --- a/monetdb5/modules/atoms/mtime.c +++ b/monetdb5/modules/atoms/mtime.c @@ -1307,25 +1307,21 @@ date_extract_weekofyear(int *ret, date * if (*v == date_nil) { *ret = int_nil; } else { - int year, dayofweek; - date year_jan_1; - - fromdate((int) *v, &dummy, &dummy, &year); - year_jan_1 = todate(1, 1, year); - dayofweek = date_dayofweek(year_jan_1); - - if (dayofweek <= 4) { - /* 4 or more days in first week, ie week of jan 1 belongs to this year */ - *ret = (int) (1 + (*v - year_jan_1 + dayofweek - 1) / 7); - } else if (*v - year_jan_1 > 7 - dayofweek) { - /* week of jan 1 belongs to last year; but this is a later week */ - *ret = (int) ((*v - year_jan_1 + dayofweek - 1) / 7); - } else { - /* recurse to get last weekno of previous year (it is 52 or 53) */ - date lastyear_dec_31 = todate(31, 12, (year == 1) ? -1 : year - 1); - - return date_extract_weekofyear(ret, &lastyear_dec_31); - } + int dummy; + int year; + date thd; + date thd1; + + /* find the Thursday in the same week as the given date */ + thd = *v + 4 - date_dayofweek(*v); + /* extract the year (may be different from year of the given date!) */ + fromdate((int) thd, &dummy, &dummy, &year); + /* find January 4 of that year */ + thd1 = todate(4, 1, year); + /* find the Thursday of the week in which January 4 falls */ + thd1 += 4 - date_dayofweek(thd1); + /* now calculate the week number */ + *ret = (int) ((thd - thd1) / 7) + 1; } return MAL_SUCCEED; } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list