The patch I posted here was broken by the refactoring in checkin [e548e9299d](https://www.sqlite.org/cgi/src/info/e548e9299d3fd6ce). Here is a new patch, in case anyone is interested. ``` Index: src/date.c ================================================================== --- src/date.c +++ src/date.c @@ -989,17 +989,20 @@ ** ** Return a string described by FORMAT. Conversions as follows: ** ** %d day of month ** %f ** fractional seconds SS.SSS +** %G year 0000-9999 of current week's Thursday ** %H hour 00-24 ** %j day of year 000-366 ** %J ** julian day number ** %m month 01-12 ** %M minute 00-59 ** %s seconds since 1970-01-01 ** %S seconds 00-59 +** %u day of week 1-7 monday==1 +** %V week of year 01-53 week belongs to year with most of its days ** %w day of week 0-6 sunday==0 ** %W week of year 00-53 ** %Y year 0000-9999 ** %% % */ @@ -1079,15 +1082,44 @@ break; } case 'S': { sqlite3_str_appendf(&sRes,"%02d",(int)x.s); break; + } + case 'u': { + sqlite3_str_appendchar(&sRes, 1, + (char)(((x.iJD+43200000)/86400000) % 7) + '1'); + break; } case 'w': { sqlite3_str_appendchar(&sRes, 1, (char)(((x.iJD+129600000)/86400000) % 7) + '0'); break; + } + case 'V': /* Fall thru */ + case 'G': { + DateTime y = x; + computeJD(&y); + y.validYMD = 0; + /* Adjust date to Thursday this week: + The number in parentheses is 0 for Monday, 3 for Thursday */ + y.iJD += (3 - (((y.iJD+43200000)/86400000) % 7))*86400000; + computeYMD(&y); + if( zFmt[i]=='G' ){ + sqlite3_str_appendf(&sRes,"%04d",y.Y); + }else{ + /* borrowed code from case 'j' */ + sqlite3_int64 tJD = y.iJD; + int nDay; + y.validJD = 0; + y.M = 1; + y.D = 1; + computeJD(&y); + nDay = (int)((tJD-y.iJD+43200000)/86400000); + sqlite3_str_appendf(&sRes,"%02d",nDay/7+1); + } + break; } case 'Y': { sqlite3_str_appendf(&sRes,"%04d",x.Y); break; } ```