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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list