From 3ce0236c6979aaf1175dca8613dc09cdcc64c3ef Mon Sep 17 00:00:00 2001 From: Bruce Momjian 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 614bccd72d..7f4e1a41e4 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); } -- 2.40.0