]> granicus.if.org Git - postgresql/commitdiff
Apply date patch from tiemann@cygnus.com,Michael Tiemann.
authorBruce Momjian <bruce@momjian.us>
Sun, 2 Mar 1997 02:05:33 +0000 (02:05 +0000)
committerBruce Momjian <bruce@momjian.us>
Sun, 2 Mar 1997 02:05:33 +0000 (02:05 +0000)
src/backend/utils/adt/datetimes.c

index 614bccd72df741ed47ad08ad529cd7bcfdaaac7b..7f4e1a41e46a30da7008ace93e8b2097f3709bab 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/datetimes.c,v 1.8 1997/01/26 15:31:12 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/datetimes.c,v 1.9 1997/03/02 02:05:33 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -240,32 +240,54 @@ date_smaller(int4 dateVal1, int4 dateVal2)
 int32
 date_mi(int4 dateVal1, int4 dateVal2)
 {
+  int4 dv1, dv2;
   DateADT *date1, *date2;
   int32 days = 0;
   int i;
 
-  date1 = (DateADT *) &dateVal1;
-  date2 = (DateADT *) &dateVal2;
+  /* This circumlocution allows us to assume that date1 is always
+     before date2.  */
+  dv1 = date_smaller (dateVal1, dateVal2);
+  dv2 = date_larger (dateVal1, dateVal2);
+  date1 = (DateADT *) &dv1;
+  date2 = (DateADT *) &dv2;
 
   /* Sum number of days in each full year between date1 and date2.  */
   for (i = date1->year + 1; i < date2->year; ++i)
     days += isleap (i) ? 366 : 365;
 
-  /* Add in number of days in each full month from date1 to end of
-     year.  */
-  for (i = date1->month + 1; i <= 12; ++i)
-    days += day_tab[isleap (date1->year)][i - 1];
-
-  /* Add in number of days in each full month from start of year to
-     date2.  */
-  for (i = 1; i < date2->month; ++i)
-    days += day_tab[isleap (date2->year)][i - 1];
+  if (days)
+    {
+      /* We need to wrap around the year.  Add in number of days in each
+        full month from date1 to end of year.  */
+      for (i = date1->month + 1; i <= 12; ++i)
+       days += day_tab[isleap (date1->year)][i - 1];
+
+      /* Add in number of days in each full month from start of year to
+        date2.  */
+      for (i = 1; i < date2->month; ++i)
+       days += day_tab[isleap (date2->year)][i - 1];
+    }
+  else
+    {
+      /* Add in number of days in each full month from date1 to date2.  */
+      for (i = date1->month + 1; i < date2->month; ++i)
+       days += day_tab[isleap (date1->year)][i - 1];
+    }
 
-  /* Add in number of days left in month for date1.  */
-  days += day_tab[isleap (date1->year)][date1->month - 1] - date1->day;
+  if (days || date1->month != date2->month)
+    {
+      /* Add in number of days left in month for date1.  */
+      days += day_tab[isleap (date1->year)][date1->month - 1] - date1->day;
 
-  /* Add in day of month of date2.  */
-  days += date2->day;
+      /* Add in day of month of date2.  */
+      days += date2->day;
+    }
+  else
+    {
+      /* Everything's in the same month, so just subtract the days!  */
+      days = date2->day - date1->day;
+    }
 
   return (days);
 }