Enable timespan_finite() and text_timespan() routines (was commented out).

Define an "ISO-style" timespan output format with "hh:mm:ss" fields.
 Enabled by DateStyle = USE_ISO_DATES.
This commit is contained in:
Thomas G. Lockhart 1997-12-17 23:22:17 +00:00
parent 5af05c0a59
commit d451a3b3bc

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/dt.c,v 1.45 1997/12/04 23:30:52 thomas Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/dt.c,v 1.46 1997/12/17 23:22:17 thomas Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -31,26 +31,24 @@
#endif #endif
#include "utils/builtins.h" #include "utils/builtins.h"
static int DecodeDate(char *str, int fmask, int *tmask, struct tm * tm); static int DecodeDate(char *str, int fmask, int *tmask, struct tm * tm);
static int static int
DecodeNumber(int flen, char *field, DecodeNumber(int flen, char *field,
int fmask, int *tmask, struct tm * tm, double *fsec); int fmask, int *tmask, struct tm * tm, double *fsec);
static int static int
DecodeNumberField(int len, char *str, DecodeNumberField(int len, char *str,
int fmask, int *tmask, struct tm * tm, double *fsec); int fmask, int *tmask, struct tm * tm, double *fsec);
static int DecodeSpecial(int field, char *lowtoken, int *val); static int DecodeSpecial(int field, char *lowtoken, int *val);
static int static int
DecodeTime(char *str, int fmask, int *tmask, DecodeTime(char *str, int fmask, int *tmask,
struct tm * tm, double *fsec); struct tm * tm, double *fsec);
static int DecodeTimezone(char *str, int *tzp); static int DecodeTimezone(char *str, int *tzp);
static int DecodeUnits(int field, char *lowtoken, int *val); static int DecodeUnits(int field, char *lowtoken, int *val);
static int EncodeSpecialDateTime(DateTime dt, char *str); static int EncodeSpecialDateTime(DateTime dt, char *str);
static datetkn *datebsearch(char *key, datetkn *base, unsigned int nel); static datetkn *datebsearch(char *key, datetkn *base, unsigned int nel);
static DateTime dt2local(DateTime dt, int timezone); static DateTime dt2local(DateTime dt, int timezone);
static void dt2time(DateTime dt, int *hour, int *min, double *sec); static void dt2time(DateTime dt, int *hour, int *min, double *sec);
static int j2day(int jd); static int j2day(int jd);
static int timespan2tm(TimeSpan span, struct tm * tm, float8 *fsec);
static int tm2timespan(struct tm * tm, double fsec, TimeSpan *span);
#define USE_DATE_CACHE 1 #define USE_DATE_CACHE 1
#define ROUND_ALL 0 #define ROUND_ALL 0
@ -297,8 +295,6 @@ datetime_finite(DateTime *datetime)
return (!DATETIME_NOT_FINITE(*datetime)); return (!DATETIME_NOT_FINITE(*datetime));
} /* datetime_finite() */ } /* datetime_finite() */
#ifdef NOT_USED
bool bool
timespan_finite(TimeSpan *timespan) timespan_finite(TimeSpan *timespan)
{ {
@ -308,7 +304,6 @@ timespan_finite(TimeSpan *timespan)
return (!TIMESPAN_NOT_FINITE(*timespan)); return (!TIMESPAN_NOT_FINITE(*timespan));
} /* timespan_finite() */ } /* timespan_finite() */
#endif
/*---------------------------------------------------------- /*----------------------------------------------------------
* Relational operators for datetime. * Relational operators for datetime.
@ -1368,8 +1363,7 @@ timespan_text(TimeSpan *timespan)
* Text type may not be null terminated, so copy to temporary string * Text type may not be null terminated, so copy to temporary string
* then call the standard input routine. * then call the standard input routine.
*/ */
#ifdef NOT_USED TimeSpan *
TimeSpan *
text_timespan(text *str) text_timespan(text *str)
{ {
TimeSpan *result; TimeSpan *result;
@ -1392,8 +1386,6 @@ text_timespan(text *str)
return (result); return (result);
} /* text_timespan() */ } /* text_timespan() */
#endif
/* datetime_trunc() /* datetime_trunc()
* Extract specified field from datetime. * Extract specified field from datetime.
*/ */
@ -2573,7 +2565,7 @@ tm2datetime(struct tm * tm, double fsec, int *tzp, DateTime *result)
/* timespan2tm() /* timespan2tm()
* Convert a timespan data type to a tm structure. * Convert a timespan data type to a tm structure.
*/ */
static int int
timespan2tm(TimeSpan span, struct tm * tm, float8 *fsec) timespan2tm(TimeSpan span, struct tm * tm, float8 *fsec)
{ {
double time; double time;
@ -2610,7 +2602,7 @@ timespan2tm(TimeSpan span, struct tm * tm, float8 *fsec)
return 0; return 0;
} /* timespan2tm() */ } /* timespan2tm() */
static int int
tm2timespan(struct tm * tm, double fsec, TimeSpan *span) tm2timespan(struct tm * tm, double fsec, TimeSpan *span)
{ {
span->month = ((tm->tm_year * 12) + tm->tm_mon); span->month = ((tm->tm_year * 12) + tm->tm_mon);
@ -4369,10 +4361,19 @@ EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str)
{ {
int is_before = FALSE; int is_before = FALSE;
int is_nonzero = FALSE; int is_nonzero = FALSE;
char *cp; char *cp = str;
strcpy(str, "@"); switch (style)
cp = str + strlen(str); {
/* compatible with ISO date formats */
case USE_ISO_DATES:
break;
default:
strcpy(cp, "@");
cp += strlen(cp);
break;
}
if (tm->tm_year != 0) if (tm->tm_year != 0)
{ {
@ -4398,39 +4399,73 @@ EncodeTimeSpan(struct tm * tm, double fsec, int style, char *str)
cp += strlen(cp); cp += strlen(cp);
} }
if (tm->tm_hour != 0) switch (style)
{ {
is_nonzero = TRUE; /* compatible with ISO date formats */
is_before |= (tm->tm_hour < 0); case USE_ISO_DATES:
sprintf(cp, " %d hour%s", abs(tm->tm_hour), ((abs(tm->tm_hour) != 1) ? "s" : "")); if ((tm->tm_hour != 0) || (tm->tm_min != 0))
cp += strlen(cp); is_nonzero = TRUE;
} is_before |= ((tm->tm_hour < 0) || (tm->tm_min < 0));
sprintf(cp, " %02d:%02d", abs(tm->tm_hour), abs(tm->tm_min));
cp += strlen(cp);
if (tm->tm_min != 0) /* fractional seconds? */
{ if (fsec != 0)
is_nonzero = TRUE; {
is_before |= (tm->tm_min < 0); is_nonzero = TRUE;
sprintf(cp, " %d min%s", abs(tm->tm_min), ((abs(tm->tm_min) != 1) ? "s" : "")); fsec += tm->tm_sec;
cp += strlen(cp); is_before |= (fsec < 0);
} sprintf(cp, ":%05.2f", fabs(fsec));
cp += strlen(cp);
/* fractional seconds? */ /* otherwise, integer seconds only? */
if (fsec != 0) }
{ else if (tm->tm_sec != 0)
is_nonzero = TRUE; {
fsec += tm->tm_sec; is_nonzero = TRUE;
is_before |= (fsec < 0); is_before |= (tm->tm_sec < 0);
sprintf(cp, " %.2f secs", fabs(fsec)); sprintf(cp, ":%02d", abs(tm->tm_sec));
cp += strlen(cp); cp += strlen(cp);
}
break;
/* otherwise, integer seconds only? */ case USE_POSTGRES_DATES:
} default:
else if (tm->tm_sec != 0) if (tm->tm_hour != 0)
{ {
is_nonzero = TRUE; is_nonzero = TRUE;
is_before |= (tm->tm_sec < 0); is_before |= (tm->tm_hour < 0);
sprintf(cp, " %d sec%s", abs(tm->tm_sec), ((abs(tm->tm_sec) != 1) ? "s" : "")); sprintf(cp, " %d hour%s", abs(tm->tm_hour), ((abs(tm->tm_hour) != 1) ? "s" : ""));
cp += strlen(cp); cp += strlen(cp);
}
if (tm->tm_min != 0)
{
is_nonzero = TRUE;
is_before |= (tm->tm_min < 0);
sprintf(cp, " %d min%s", abs(tm->tm_min), ((abs(tm->tm_min) != 1) ? "s" : ""));
cp += strlen(cp);
}
/* fractional seconds? */
if (fsec != 0)
{
is_nonzero = TRUE;
fsec += tm->tm_sec;
is_before |= (fsec < 0);
sprintf(cp, " %.2f secs", fabs(fsec));
cp += strlen(cp);
/* otherwise, integer seconds only? */
}
else if (tm->tm_sec != 0)
{
is_nonzero = TRUE;
is_before |= (tm->tm_sec < 0);
sprintf(cp, " %d sec%s", abs(tm->tm_sec), ((abs(tm->tm_sec) != 1) ? "s" : ""));
cp += strlen(cp);
}
break;
} }
/* identically zero? then put in a unitless zero... */ /* identically zero? then put in a unitless zero... */