diff options
Diffstat (limited to 'src/backend/utils/adt/datetimes.c')
-rw-r--r-- | src/backend/utils/adt/datetimes.c | 100 |
1 files changed, 99 insertions, 1 deletions
diff --git a/src/backend/utils/adt/datetimes.c b/src/backend/utils/adt/datetimes.c index f38b2c1171a..693351a380e 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.6 1996/11/10 03:03:10 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/datetimes.c,v 1.7 1996/11/14 21:38:58 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -224,6 +224,104 @@ date_cmp(int4 dateVal1, int4 dateVal2) return 0; } +int4 +date_larger(int4 dateVal1, int4 dateVal2) +{ + return (date_gt (dateVal1, dateVal2) ? dateVal1 : dateVal2); +} + +int4 +date_smaller(int4 dateVal1, int4 dateVal2) +{ + return (date_lt (dateVal1, dateVal2) ? dateVal1 : dateVal2); +} + +/* Compute difference between two dates in days. */ +int32 +date_mi(int4 dateVal1, int4 dateVal2) +{ + DateADT *date1, *date2; + int32 days = 0; + int i; + + date1 = (DateADT *) &dateVal1; + date2 = (DateADT *) &dateVal2; + + /* 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]; + + /* 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; + + return (days); +} + +/* Add a number of days to a date, giving a new date. + Must handle both positive and negative numbers of days. */ +int4 +date_pli(int4 dateVal, int32 days) +{ + DateADT *date1 = (DateADT *) &dateVal; + /* Use separate day variable because date1->day is a narrow type. */ + int32 day = date1->day + days; + + if (days > 0) + { + /* Loop as long as day has wrapped around end of month. */ + while (day > day_tab[isleap (date1->year)][date1->month - 1]) + { + day -= day_tab[isleap (date1->year)][date1->month - 1]; + if (++date1->month > 12) + { + /* Month wrapped around. */ + date1->month = 1; + ++date1->year; + } + } + } + else + { + /* Loop as long as day has wrapped around beginning of month. */ + while (day < 1) + { + /* Decrement month first, because a negative day number + should be held as relative to the previous month's end. */ + if (--date1->month < 1) + { + /* Month wrapped around. */ + date1->month = 12; + --date1->year; + } + + day += day_tab[isleap (date1->year)][date1->month - 1]; + } + } + date1->day = day; + + return (dateVal); +} + +/* Subtract a number of days from a date, giving a new date. */ +int4 +date_mii(int4 dateVal, int32 days) +{ + return (date_pli (dateVal, -days)); +} + /***************************************************************************** * Time ADT *****************************************************************************/ |