From: drh <> Date: Wed, 1 Jul 2026 11:57:20 +0000 (+0000) Subject: Add "end of day/month/year" modifiers to date/time functions. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=12fad2e03ca5fe0660ea328650617c6cca6bb1a7;p=thirdparty%2Fsqlite.git Add "end of day/month/year" modifiers to date/time functions. FossilOrigin-Name: 2c4cb3223c6c56d05fe91b8d19b60eac26a274e41f34a2d8f2cf911927581932 --- diff --git a/manifest b/manifest index 334b51a738..f62a70b423 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\s"weekday\sN"\smodifier\sfor\sdate/time\sfunctions\ssuch\sthat\sif\nthe\sargument\sis\snegative,\sit\smove\sthe\sdate\sbackwards\sin\stime\sto\sthe\nmatching\sweekday,\srather\sthan\sforwards. -D 2026-07-01T03:02:42.977 +C Add\s"end\sof\sday/month/year"\smodifiers\sto\sdate/time\sfunctions. +D 2026-07-01T11:57:20.103 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -686,7 +686,7 @@ F src/build.c 86e97b26600535ab9dffd780ecbdb1560362e81bd2e9bcb179b52b2050c3302b F src/callback.c 3605bbf02bd7ed46c79cd48346db4a32fc51d67624400539c0532f4eead804ad F src/carray.c 3efe3982d5fb323334c29328a4e189ccaef6b95612a6084ad5fa124fd5db1179 F src/complete.c f216b970ce99c5a657556cf1f17e7ddd494515d3beb63df426bf59ff43bd3d9a -F src/date.c 36729f31ab5a8ea566271190d89c6d865d28f110a4db6a151259e240bdfbeb3f +F src/date.c 46a518e94cd9c6d0ba1cc4d9af50bcd112a1e24a942e82a35235701731e9b042 F src/dbpage.c c6a9de13b0a01f0bc94a41e16213ab1ecd15ccfe86df7255ced40fda9446257d F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c F src/delete.c 59eeca3fb88c29329afc41bb803ee568b120d9dd7470b5f38ab55cc38390b451 @@ -1036,7 +1036,7 @@ F test/ctime.test 340f362f41f92972bbd71f44e10569a5cc694062b692231bd08aa6fe6c1c47 F test/cursorhint.test d8b93ac48dfdb2cf4284142710d63e860b6497afff2e9c525daf752a229e5b97 F test/cursorhint2.test a10f29c0c52d4d73c19cf639f3c33cccbf5024bcf950fa48f2a8cdc14628b985 F test/dataversion1.test 6e5e86ac681f0782e766ebcb56c019ae001522d114e0e111e5ebf68ccf2a7bb8 -F test/date.test 00b94b54142684d9933cb9863113e33ee340e605abceb1139c0c982cf6626977 +F test/date.test 0c362a642cf3520a14eed6098faa454cd5def17c592c8dd4aa06894ca7e7ad5a F test/date2.test 7e12ec14aaf4d5e6294b4ba140445b0eca06ea50062a9c3a69c4ee13d0b6f8b1 F test/date3.test a1b77abf05c6772fe5ca2337cac1398892f2a41e62bce7e6be0f4a08a0e64ae5 F test/date4.test b5ad22baf7394e008ac59383840159daedd45be31dcf74a3b2450ec0e28955ce @@ -2210,11 +2210,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 007f0496619e571092382a3668b6bbcc17919908895dc4be71f8d1b6ec2aeeed -R 18313aa34d61ec6c7f4d87ce028e01a7 -T *branch * prev-weekday -T *sym-prev-weekday * -T -sym-trunk * +P e31bea6ce188fb3ae2d8da132a40a182431d701dc6b991af470337a1cdd3f8e4 +R 1e8cc3c2fef8cd515a643be551bc5111 U drh -Z b811783717ad5a74ebd02205196154d7 +Z 2e9ade7347393c5621e35f8d1718f262 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 9281553912..3ff30545bb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e31bea6ce188fb3ae2d8da132a40a182431d701dc6b991af470337a1cdd3f8e4 +2c4cb3223c6c56d05fe91b8d19b60eac26a274e41f34a2d8f2cf911927581932 diff --git a/src/date.c b/src/date.c index 0e0f8ae86e..1455d111e0 100644 --- a/src/date.c +++ b/src/date.c @@ -767,6 +767,49 @@ static int parseModifier( } break; } + case 'e': { + /* + ** end of day + ** end of month + ** end of year + ** + ** Move the date forwards to the last millisecond of the current + ** day, month or year. + */ + if( sqlite3_strnicmp(z, "end of ", 7)!=0 ){ + break; + } + if( !p->validJD && !p->validYMD && !p->validHMS ) break; + z += 7; + computeYMD(p); + p->validHMS = 1; + p->h = 23; + p->m = 59; + p->s = 59.999; + p->rawS = 0; + p->tz = 0; + p->validJD = 0; + if( sqlite3_stricmp(z,"month")==0 ){ + p->D = 1; + p->M++; + if( p->M>12 ){ + p->Y++; + p->M = 1; + } + computeFloor(p); + computeJD(p); + p->iJD -= (p->nFloor+1)*86400000; + clearYMD_HMS_TZ(p); + rc = 0; + }else if( sqlite3_stricmp(z,"year")==0 ){ + p->M = 12; + p->D = 31; + rc = 0; + }else if( sqlite3_stricmp(z,"day")==0 ){ + rc = 0; + } + break; + } case 'f': { /* ** floor @@ -900,7 +943,9 @@ static int parseModifier( } case 's': { /* - ** start of TTTTT + ** start of day + ** start of month + ** start of year ** ** Move the date backwards to the beginning of the current day, ** or month or year. diff --git a/test/date.test b/test/date.test index 4d5fd242da..cc24cbfdf7 100644 --- a/test/date.test +++ b/test/date.test @@ -112,12 +112,20 @@ datetest 2.11b {date('2003-10-22','weekday -5.5')} NULL datetest 2.12 {datetime('2003-10-22 12:34','weekday 0')} {2003-10-26 12:34:00} datetest 2.13 {datetime('2003-10-22 12:34','start of month')} \ {2003-10-01 00:00:00} +datetest 2.13b {datetime('2003-10-22 12:34','end of month')} \ + {2003-10-31 23:59:59} datetest 2.14 {datetime('2003-10-22 12:34','start of year')} \ {2003-01-01 00:00:00} +datetest 2.14b {datetime('2003-10-22 12:34','end of year')} \ + {2003-12-31 23:59:59} datetest 2.15 {datetime('2003-10-22 12:34','start of day')} \ {2003-10-22 00:00:00} -datetest 2.15a {datetime('2003-10-22 12:34','start of')} NULL -datetest 2.15b {datetime('2003-10-22 12:34','start of bogus')} NULL +datetest 2.15b {datetime('2003-10-22 12:34','end of day','subsec')} \ + {2003-10-22 23:59:59.999} +datetest 2.15c {datetime('2003-10-22 12:34','start of')} NULL +datetest 2.15d {datetime('2003-10-22 12:34','start of bogus')} NULL +datetest 2.15e {datetime('2003-10-22 12:34','end of')} NULL +datetest 2.15f {datetime('2003-10-22 12:34','end of bogus')} NULL datetest 2.16 time('12:34:56.43') 12:34:56 datetest 2.17 {datetime('2003-10-22 12:34','1 day')} {2003-10-23 12:34:00} datetest 2.18 {datetime('2003-10-22 12:34','+1 day')} {2003-10-23 12:34:00} @@ -694,4 +702,40 @@ datetest 20.2 {datetime('2024-12-31 23:59:59.9999999999999')} \ datetest 20.3 {datetime('2024-12-31 23:59:59.9995')} {2024-12-31 23:59:59} datetest 20.4 {datetime('2024-12-31 23:59:58.9995')} {2024-12-31 23:59:58} +# 2026-07-01 +# Additional tests for the new "weekday -N" and "end of ..." modifiers. +# +datetest 21.1 {date('2026-07-04','weekday +0')} {2026-07-05} +datetest 21.2 {date('2026-07-05','weekday -0')} {2026-07-05} +datetest 21.3 {date('2026-07-04','weekday -0')} {2026-06-28} +datetest 21.4 {date('2026-07-03','weekday -0')} {2026-06-28} +datetest 21.5 {date('2026-07-02','weekday -0')} {2026-06-28} +datetest 21.6 {date('2026-07-01','weekday -0')} {2026-06-28} +datetest 21.7 {date('2026-06-30','weekday -0')} {2026-06-28} +datetest 21.8 {date('2026-06-29','weekday -0')} {2026-06-28} +datetest 21.9 {date('2026-06-28','weekday -0')} {2026-06-28} +datetest 21.10 {date('2026-07-05','weekday +0')} {2026-07-05} +datetest 21.11 {date('2026-07-04','weekday +0')} {2026-07-05} +datetest 21.12 {date('2026-07-03','weekday +0')} {2026-07-05} +datetest 21.13 {date('2026-07-02','weekday +0')} {2026-07-05} +datetest 21.14 {date('2026-07-01','weekday +0')} {2026-07-05} +datetest 21.15 {date('2026-06-30','weekday +0')} {2026-07-05} +datetest 21.16 {date('2026-06-29','weekday +0')} {2026-07-05} +datetest 21.17 {date('2026-06-28','weekday +0')} {2026-06-28} +datetest 22.1 {datetime('2026-02-17 12:34','end of day','subsec')} \ + {2026-02-17 23:59:59.999} +datetest 22.2 {datetime('2026-02-17 12:34','end of month','subsec')} \ + {2026-02-28 23:59:59.999} +datetest 22.3 {datetime('2024-02-17 12:34','end of month','subsec')} \ + {2024-02-29 23:59:59.999} +datetest 22.4 {datetime('1900-02-17 12:34','end of month','subsec')} \ + {1900-02-28 23:59:59.999} +datetest 22.5 {datetime('2026-12-17 12:34','end of month','subsec')} \ + {2026-12-31 23:59:59.999} +datetest 22.6 {datetime('2026-02-17 12:34','end of year','subsec')} \ + {2026-12-31 23:59:59.999} +datetest 22.7 {datetime('2026-02-17 12:34','end of time','subsec')} {NULL} + + + finish_test