aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/datetimes.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt/datetimes.c')
-rw-r--r--src/backend/utils/adt/datetimes.c100
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
*****************************************************************************/