*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
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);
}