diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c new file mode 100644 index 25af8a2..2aa6df1 *** a/src/backend/utils/adt/formatting.c --- b/src/backend/utils/adt/formatting.c *************** typedef struct *** 412,418 **** mi, ss, ssss, ! d, dd, ddd, mm, --- 412,418 ---- mi, ss, ssss, ! d, /* stored as 1-7, Sunday = 1, 0 means missing */ dd, ddd, mm, *************** DCH_from_char(FormatNode *node, char *in *** 2897,2902 **** --- 2897,2903 ---- from_char_seq_search(&value, &s, days, ONE_UPPER, MAX_DAY_LEN, n); from_char_set_int(&out->d, value, n); + out->d++; break; case DCH_DY: case DCH_Dy: *************** DCH_from_char(FormatNode *node, char *in *** 2904,2909 **** --- 2905,2911 ---- from_char_seq_search(&value, &s, days, ONE_UPPER, MAX_DY_LEN, n); from_char_set_int(&out->d, value, n); + out->d++; break; case DCH_DDD: from_char_parse_int(&out->ddd, &s, n); *************** DCH_from_char(FormatNode *node, char *in *** 2919,2929 **** break; case DCH_D: from_char_parse_int(&out->d, &s, n); - out->d--; s += SKIP_THth(n->suffix); break; case DCH_ID: from_char_parse_int_len(&out->d, &s, 1, n); s += SKIP_THth(n->suffix); break; case DCH_WW: --- 2921,2933 ---- break; case DCH_D: from_char_parse_int(&out->d, &s, n); s += SKIP_THth(n->suffix); break; case DCH_ID: from_char_parse_int_len(&out->d, &s, 1, n); + /* Shift numbering to match Gregorian where Sunday = 1 */ + if (++out->d > 7) + out->d = 1; s += SKIP_THth(n->suffix); break; case DCH_WW: *************** do_to_timestamp(text *date_txt, text *fm *** 3534,3540 **** if (tmfc.w) tmfc.dd = (tmfc.w - 1) * 7 + 1; if (tmfc.d) ! tm->tm_wday = tmfc.d; if (tmfc.dd) tm->tm_mday = tmfc.dd; if (tmfc.ddd) --- 3538,3544 ---- if (tmfc.w) tmfc.dd = (tmfc.w - 1) * 7 + 1; if (tmfc.d) ! tm->tm_wday = tmfc.d - 1; /* convert to native numbering */ if (tmfc.dd) tm->tm_mday = tmfc.dd; if (tmfc.ddd) diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c new file mode 100644 index 2adc178..50ef897 *** a/src/backend/utils/adt/timestamp.c --- b/src/backend/utils/adt/timestamp.c *************** isoweek2date(int woy, int *year, int *mo *** 3775,3792 **** /* isoweekdate2date() * ! * Convert an ISO 8601 week date (ISO year, ISO week and day of week) into a Gregorian date. * Populates year, mon, and mday with the correct Gregorian values. * year must be passed in as the ISO year. */ void ! isoweekdate2date(int isoweek, int isowday, int *year, int *mon, int *mday) { int jday; jday = isoweek2j(*year, isoweek); ! jday += isowday - 1; ! j2date(jday, year, mon, mday); } --- 3775,3796 ---- /* isoweekdate2date() * ! * Convert an ISO 8601 week date (ISO year, ISO week) into a Gregorian date. ! * Gregorian day of week sent so weekday strings can be supplied. * Populates year, mon, and mday with the correct Gregorian values. * year must be passed in as the ISO year. */ void ! isoweekdate2date(int isoweek, int wday, int *year, int *mon, int *mday) { int jday; jday = isoweek2j(*year, isoweek); ! /* convert Gregorian week start (Sunday=1) to ISO week start (Monday=1) */ ! if (wday > 1) ! jday += wday - 2; ! else ! jday += 6; j2date(jday, year, mon, mday); } diff --git a/src/include/utils/timestamp.h b/src/include/utils/timestamp.h new file mode 100644 index 665e969..e7cdb41 *** a/src/include/utils/timestamp.h --- b/src/include/utils/timestamp.h *************** extern int timestamp_cmp_internal(Timest *** 236,242 **** extern int isoweek2j(int year, int week); extern void isoweek2date(int woy, int *year, int *mon, int *mday); ! extern void isoweekdate2date(int isoweek, int isowday, int *year, int *mon, int *mday); extern int date2isoweek(int year, int mon, int mday); extern int date2isoyear(int year, int mon, int mday); extern int date2isoyearday(int year, int mon, int mday); --- 236,242 ---- extern int isoweek2j(int year, int week); extern void isoweek2date(int woy, int *year, int *mon, int *mday); ! extern void isoweekdate2date(int isoweek, int wday, int *year, int *mon, int *mday); extern int date2isoweek(int year, int mon, int mday); extern int date2isoyear(int year, int mon, int mday); extern int date2isoyearday(int year, int mon, int mday);