]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add "end of day/month/year" modifiers to date/time functions. prev-weekday
authordrh <>
Wed, 1 Jul 2026 11:57:20 +0000 (11:57 +0000)
committerdrh <>
Wed, 1 Jul 2026 11:57:20 +0000 (11:57 +0000)
FossilOrigin-Name: 2c4cb3223c6c56d05fe91b8d19b60eac26a274e41f34a2d8f2cf911927581932

manifest
manifest.uuid
src/date.c
test/date.test

index 334b51a7388c1ccdc578fd4fc402d2e7ab81e131..f62a70b423b9d2888e8248782fdb592c544c7598 100644 (file)
--- 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.
index 9281553912487187dc8c63aba7748997a6f46da6..3ff30545bb6560c84b94ffa44db239e26c670740 100644 (file)
@@ -1 +1 @@
-e31bea6ce188fb3ae2d8da132a40a182431d701dc6b991af470337a1cdd3f8e4
+2c4cb3223c6c56d05fe91b8d19b60eac26a274e41f34a2d8f2cf911927581932
index 0e0f8ae86e3aa3b0b9cd6a7ad7c58cb9a8189197..1455d111e01d7a6b735d5ea2fa0ead90871cdf7f 100644 (file)
@@ -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.
index 4d5fd242da7df8ef95cd47be0e1ca4bbf5338f76..cc24cbfdf7b9abebbfd2869f47d9effa0631d735 100644 (file)
@@ -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