mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-09-28 12:11:50 +02:00
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:
parent
5af05c0a59
commit
d451a3b3bc
@ -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... */
|
||||||
|
Loading…
Reference in New Issue
Block a user