mirror of
https://github.com/postgres/postgres.git
synced 2025-11-06 07:49:08 +03:00
Features added:
* Wrote max(date) and min(date) aggregates * Wrote operator "-" for date; date - date yields number of days difference * Wrote operator+(date,int) and operator-(date,int); the int is the number of days. Each operator returns a new date. By: Tom Tromey <tromey@creche.cygnus.com>
This commit is contained in:
@@ -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
|
||||
*****************************************************************************/
|
||||
|
||||
Reference in New Issue
Block a user