|
8 | 8 | *
|
9 | 9 | *
|
10 | 10 | * IDENTIFICATION
|
11 |
| - * $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.117 2004/12/31 22:01:22 pgsql Exp $ |
| 11 | + * $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.118 2005/04/01 14:25:23 momjian Exp $ |
12 | 12 | *
|
13 | 13 | *-------------------------------------------------------------------------
|
14 | 14 | */
|
@@ -2754,12 +2754,23 @@ timestamp_trunc(PG_FUNCTION_ARGS)
|
2754 | 2754 | switch (val)
|
2755 | 2755 | {
|
2756 | 2756 | case DTK_WEEK:
|
2757 |
| - isoweek2date(date2isoweek(tm->tm_year, tm->tm_mon, tm->tm_mday), &(tm->tm_year), &(tm->tm_mon), &(tm->tm_mday)); |
| 2757 | + { |
| 2758 | + int woy; |
| 2759 | + |
| 2760 | + woy = date2isoweek(tm->tm_year, tm->tm_mon, tm->tm_mday); |
| 2761 | + /* |
| 2762 | + * If it is week 52/53 and the month is January, |
| 2763 | + * then the week must belong to the previous year. |
| 2764 | + */ |
| 2765 | + if (woy >= 52 && tm->tm_mon == 1) |
| 2766 | + --tm->tm_year; |
| 2767 | + isoweek2date(woy, &(tm->tm_year), &(tm->tm_mon), &(tm->tm_mday)); |
2758 | 2768 | tm->tm_hour = 0;
|
2759 | 2769 | tm->tm_min = 0;
|
2760 | 2770 | tm->tm_sec = 0;
|
2761 | 2771 | fsec = 0;
|
2762 | 2772 | break;
|
| 2773 | + } |
2763 | 2774 | case DTK_MILLENNIUM:
|
2764 | 2775 | /* see comments in timestamptz_trunc */
|
2765 | 2776 | if (tm->tm_year > 0)
|
@@ -2874,13 +2885,24 @@ timestamptz_trunc(PG_FUNCTION_ARGS)
|
2874 | 2885 | switch (val)
|
2875 | 2886 | {
|
2876 | 2887 | case DTK_WEEK:
|
2877 |
| - isoweek2date(date2isoweek(tm->tm_year, tm->tm_mon, tm->tm_mday), &(tm->tm_year), &(tm->tm_mon), &(tm->tm_mday)); |
| 2888 | + { |
| 2889 | + int woy; |
| 2890 | + |
| 2891 | + woy = date2isoweek(tm->tm_year, tm->tm_mon, tm->tm_mday); |
| 2892 | + /* |
| 2893 | + * If it is week 52/53 and the month is January, |
| 2894 | + * then the week must belong to the previous year. |
| 2895 | + */ |
| 2896 | + if (woy >= 52 && tm->tm_mon == 1) |
| 2897 | + --tm->tm_year; |
| 2898 | + isoweek2date(woy, &(tm->tm_year), &(tm->tm_mon), &(tm->tm_mday)); |
2878 | 2899 | tm->tm_hour = 0;
|
2879 | 2900 | tm->tm_min = 0;
|
2880 | 2901 | tm->tm_sec = 0;
|
2881 | 2902 | fsec = 0;
|
2882 | 2903 | redotz = true;
|
2883 | 2904 | break;
|
| 2905 | + } |
2884 | 2906 | /* one may consider DTK_THOUSAND and DTK_HUNDRED... */
|
2885 | 2907 | case DTK_MILLENNIUM:
|
2886 | 2908 |
|
@@ -3142,7 +3164,7 @@ date2isoweek(int year, int mon, int mday)
|
3142 | 3164 | * Sometimes the last few days in a year will fall into the first week
|
3143 | 3165 | * of the next year, so check for this.
|
3144 | 3166 | */
|
3145 |
| - if (result >= 53) |
| 3167 | + if (result >= 52) |
3146 | 3168 | {
|
3147 | 3169 | day4 = date2j(year + 1, 1, 4);
|
3148 | 3170 |
|
@@ -3198,7 +3220,7 @@ date2isoyear(int year, int mon, int mday)
|
3198 | 3220 | * Sometimes the last few days in a year will fall into the first week
|
3199 | 3221 | * of the next year, so check for this.
|
3200 | 3222 | */
|
3201 |
| - if (result >= 53) |
| 3223 | + if (result >= 52) |
3202 | 3224 | {
|
3203 | 3225 | day4 = date2j(year + 1, 1, 4);
|
3204 | 3226 |
|
|
0 commit comments