From 3ce0236c6979aaf1175dca8613dc09cdcc64c3ef Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Sun, 2 Mar 1997 02:05:33 +0000
Subject: [PATCH] Apply date patch from tiemann@cygnus.com,Michael Tiemann.

---
 src/backend/utils/adt/datetimes.c | 54 ++++++++++++++++++++++---------
 1 file changed, 38 insertions(+), 16 deletions(-)

diff --git a/src/backend/utils/adt/datetimes.c b/src/backend/utils/adt/datetimes.c
index 614bccd72df..7f4e1a41e46 100644
--- a/src/backend/utils/adt/datetimes.c
+++ b/src/backend/utils/adt/datetimes.c
@@ -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);
 }
-- 
GitLab