Commit d1ab3eb7 authored by Tom Lane's avatar Tom Lane

Clean up the ancient decision to show only two fractional-seconds digits

in "postgres_verbose" intervalstyle, and the equally arbitrary decision to
show at least two fractional-seconds digits in most other datetime display
styles.  This results in some minor changes in the expected regression test
outputs.

Also, coalesce a lot of repetitive code in datetime.c into subroutines,
for clarity and ease of maintenance.  In particular this roughly halves
the number of #ifdef HAVE_INT64_TIMESTAMP segments.

Ron Mayer, with some additional kibitzing from Tom Lane
parent 466368b8
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.198 2008/11/11 02:42:32 tgl Exp $ * $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.199 2008/11/12 01:36:19 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "funcapi.h" #include "funcapi.h"
#include "miscadmin.h" #include "miscadmin.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/date.h"
#include "utils/datetime.h" #include "utils/datetime.h"
#include "utils/memutils.h" #include "utils/memutils.h"
#include "utils/tzparser.h" #include "utils/tzparser.h"
...@@ -44,6 +45,12 @@ static int DecodeDate(char *str, int fmask, int *tmask, bool *is2digits, ...@@ -44,6 +45,12 @@ static int DecodeDate(char *str, int fmask, int *tmask, bool *is2digits,
static int ValidateDate(int fmask, bool is2digits, bool bc, static int ValidateDate(int fmask, bool is2digits, bool bc,
struct pg_tm * tm); struct pg_tm * tm);
static void TrimTrailingZeros(char *str); static void TrimTrailingZeros(char *str);
static void AppendSeconds(char *cp, int sec, fsec_t fsec,
int precision, bool fillzeros);
static void AdjustFractSeconds(double frac, struct pg_tm * tm, fsec_t *fsec,
int scale);
static void AdjustFractDays(double frac, struct pg_tm * tm, fsec_t *fsec,
int scale);
const int day_tab[2][13] = const int day_tab[2][13] =
...@@ -401,29 +408,130 @@ GetCurrentTimeUsec(struct pg_tm * tm, fsec_t *fsec, int *tzp) ...@@ -401,29 +408,130 @@ GetCurrentTimeUsec(struct pg_tm * tm, fsec_t *fsec, int *tzp)
/* TrimTrailingZeros() /* TrimTrailingZeros()
* ... resulting from printing numbers with full precision. * ... resulting from printing numbers with full precision.
*
* Before Postgres 8.4, this always left at least 2 fractional digits,
* but conversations on the lists suggest this isn't desired
* since showing '0.10' is misleading with values of precision(1).
*/ */
static void static void
TrimTrailingZeros(char *str) TrimTrailingZeros(char *str)
{ {
int len = strlen(str); int len = strlen(str);
#if 0 while (len > 1 && *(str + len - 1) == '0' && *(str + len - 2) != '.')
/* chop off trailing one to cope with interval rounding */
if (strcmp(str + len - 4, "0001") == 0)
{ {
len -= 4; len--;
*(str + len) = '\0'; *(str + len) = '\0';
} }
#endif }
/* chop off trailing zeros... but leave at least 2 fractional digits */ /*
while (*(str + len - 1) == '0' && *(str + len - 3) != '.') * Append sections and fractional seconds (if any) at *cp.
* precision is the max number of fraction digits, fillzeros says to
* pad to two integral-seconds digits.
* Note that any sign is stripped from the input seconds values.
*/
static void
AppendSeconds(char *cp, int sec, fsec_t fsec, int precision, bool fillzeros)
{
if (fsec == 0)
{ {
len--; if (fillzeros)
*(str + len) = '\0'; sprintf(cp, "%02d", abs(sec));
else
sprintf(cp, "%d", abs(sec));
}
else
{
#ifdef HAVE_INT64_TIMESTAMP
if (fillzeros)
sprintf(cp, "%02d.%0*d", abs(sec), precision, (int) Abs(fsec));
else
sprintf(cp, "%d.%0*d", abs(sec), precision, (int) Abs(fsec));
#else
if (fillzeros)
sprintf(cp, "%0*.*f", precision + 3, precision, fabs(sec + fsec));
else
sprintf(cp, "%.*f", precision, fabs(sec + fsec));
#endif
TrimTrailingZeros(cp);
} }
} }
/* Variant of above that's specialized to timestamp case */
static void
AppendTimestampSeconds(char *cp, struct pg_tm * tm, fsec_t fsec)
{
/*
* In float mode, don't print fractional seconds before 1 AD,
* since it's unlikely there's any precision left ...
*/
#ifndef HAVE_INT64_TIMESTAMP
if (tm->tm_year <= 0)
fsec = 0;
#endif
AppendSeconds(cp, tm->tm_sec, fsec, MAX_TIMESTAMP_PRECISION, true);
}
/*
* Multiply frac by scale (to produce seconds) and add to *tm & *fsec.
* We assume the input frac is less than 1 so overflow is not an issue.
*/
static void
AdjustFractSeconds(double frac, struct pg_tm * tm, fsec_t *fsec, int scale)
{
int sec;
if (frac == 0)
return;
frac *= scale;
sec = (int) frac;
tm->tm_sec += sec;
frac -= sec;
#ifdef HAVE_INT64_TIMESTAMP
*fsec += rint(frac * 1000000);
#else
*fsec += frac;
#endif
}
/* As above, but initial scale produces days */
static void
AdjustFractDays(double frac, struct pg_tm * tm, fsec_t *fsec, int scale)
{
int extra_days;
if (frac == 0)
return;
frac *= scale;
extra_days = (int) frac;
tm->tm_mday += extra_days;
frac -= extra_days;
AdjustFractSeconds(frac, tm, fsec, SECS_PER_DAY);
}
/* Fetch a fractional-second value with suitable error checking */
static int
ParseFractionalSecond(char *cp, fsec_t *fsec)
{
double frac;
/* Caller should always pass the start of the fraction part */
Assert(*cp == '.');
errno = 0;
frac = strtod(cp, &cp);
/* check for parse failure */
if (*cp != '\0' || errno != 0)
return DTERR_BAD_FORMAT;
#ifdef HAVE_INT64_TIMESTAMP
*fsec = rint(frac * 1000000);
#else
*fsec = frac;
#endif
return 0;
}
/* ParseDateTime() /* ParseDateTime()
* Break string into tokens based on a date/time context. * Break string into tokens based on a date/time context.
* Returns 0 if successful, DTERR code if bogus input detected. * Returns 0 if successful, DTERR code if bogus input detected.
...@@ -943,16 +1051,9 @@ DecodeDateTime(char **field, int *ftype, int nf, ...@@ -943,16 +1051,9 @@ DecodeDateTime(char **field, int *ftype, int nf,
tmask = DTK_M(SECOND); tmask = DTK_M(SECOND);
if (*cp == '.') if (*cp == '.')
{ {
double frac; dterr = ParseFractionalSecond(cp, fsec);
if (dterr)
frac = strtod(cp, &cp); return dterr;
if (*cp != '\0')
return DTERR_BAD_FORMAT;
#ifdef HAVE_INT64_TIMESTAMP
*fsec = rint(frac * 1000000);
#else
*fsec = frac;
#endif
tmask = DTK_ALL_SECS_M; tmask = DTK_ALL_SECS_M;
} }
break; break;
...@@ -975,19 +1076,20 @@ DecodeDateTime(char **field, int *ftype, int nf, ...@@ -975,19 +1076,20 @@ DecodeDateTime(char **field, int *ftype, int nf,
{ {
double time; double time;
errno = 0;
time = strtod(cp, &cp); time = strtod(cp, &cp);
if (*cp != '\0') if (*cp != '\0' || errno != 0)
return DTERR_BAD_FORMAT; return DTERR_BAD_FORMAT;
tmask |= DTK_TIME_M;
#ifdef HAVE_INT64_TIMESTAMP #ifdef HAVE_INT64_TIMESTAMP
dt2time(time * USECS_PER_DAY, time *= USECS_PER_DAY;
&tm->tm_hour, &tm->tm_min,
&tm->tm_sec, fsec);
#else #else
dt2time(time * SECS_PER_DAY, &tm->tm_hour, time *= SECS_PER_DAY;
&tm->tm_min, &tm->tm_sec, fsec);
#endif #endif
dt2time(time,
&tm->tm_hour, &tm->tm_min,
&tm->tm_sec, fsec);
tmask |= DTK_TIME_M;
} }
break; break;
...@@ -1679,16 +1781,9 @@ DecodeTimeOnly(char **field, int *ftype, int nf, ...@@ -1679,16 +1781,9 @@ DecodeTimeOnly(char **field, int *ftype, int nf,
tmask = DTK_M(SECOND); tmask = DTK_M(SECOND);
if (*cp == '.') if (*cp == '.')
{ {
double frac; dterr = ParseFractionalSecond(cp, fsec);
if (dterr)
frac = strtod(cp, &cp); return dterr;
if (*cp != '\0')
return DTERR_BAD_FORMAT;
#ifdef HAVE_INT64_TIMESTAMP
*fsec = rint(frac * 1000000);
#else
*fsec = frac;
#endif
tmask = DTK_ALL_SECS_M; tmask = DTK_ALL_SECS_M;
} }
break; break;
...@@ -1710,18 +1805,20 @@ DecodeTimeOnly(char **field, int *ftype, int nf, ...@@ -1710,18 +1805,20 @@ DecodeTimeOnly(char **field, int *ftype, int nf,
{ {
double time; double time;
errno = 0;
time = strtod(cp, &cp); time = strtod(cp, &cp);
if (*cp != '\0') if (*cp != '\0' || errno != 0)
return DTERR_BAD_FORMAT; return DTERR_BAD_FORMAT;
tmask |= DTK_TIME_M;
#ifdef HAVE_INT64_TIMESTAMP #ifdef HAVE_INT64_TIMESTAMP
dt2time(time * USECS_PER_DAY, time *= USECS_PER_DAY;
&tm->tm_hour, &tm->tm_min, &tm->tm_sec, fsec);
#else #else
dt2time(time * SECS_PER_DAY, time *= SECS_PER_DAY;
&tm->tm_hour, &tm->tm_min, &tm->tm_sec, fsec);
#endif #endif
dt2time(time,
&tm->tm_hour, &tm->tm_min,
&tm->tm_sec, fsec);
tmask |= DTK_TIME_M;
} }
break; break;
...@@ -2231,6 +2328,7 @@ DecodeTime(char *str, int fmask, int range, ...@@ -2231,6 +2328,7 @@ DecodeTime(char *str, int fmask, int range,
int *tmask, struct pg_tm * tm, fsec_t *fsec) int *tmask, struct pg_tm * tm, fsec_t *fsec)
{ {
char *cp; char *cp;
int dterr;
*tmask = DTK_TIME_M; *tmask = DTK_TIME_M;
...@@ -2240,9 +2338,8 @@ DecodeTime(char *str, int fmask, int range, ...@@ -2240,9 +2338,8 @@ DecodeTime(char *str, int fmask, int range,
return DTERR_FIELD_OVERFLOW; return DTERR_FIELD_OVERFLOW;
if (*cp != ':') if (*cp != ':')
return DTERR_BAD_FORMAT; return DTERR_BAD_FORMAT;
str = cp + 1;
errno = 0; errno = 0;
tm->tm_min = strtoi(str, &cp, 10); tm->tm_min = strtoi(cp + 1, &cp, 10);
if (errno == ERANGE) if (errno == ERANGE)
return DTERR_FIELD_OVERFLOW; return DTERR_FIELD_OVERFLOW;
if (*cp == '\0') if (*cp == '\0')
...@@ -2260,43 +2357,26 @@ DecodeTime(char *str, int fmask, int range, ...@@ -2260,43 +2357,26 @@ DecodeTime(char *str, int fmask, int range,
else if (*cp == '.') else if (*cp == '.')
{ {
/* always assume mm:ss.sss is MINUTE TO SECOND */ /* always assume mm:ss.sss is MINUTE TO SECOND */
double frac; dterr = ParseFractionalSecond(cp, fsec);
if (dterr)
str = cp; return dterr;
frac = strtod(str, &cp);
if (*cp != '\0')
return DTERR_BAD_FORMAT;
#ifdef HAVE_INT64_TIMESTAMP
*fsec = rint(frac * 1000000);
#else
*fsec = frac;
#endif
tm->tm_sec = tm->tm_min; tm->tm_sec = tm->tm_min;
tm->tm_min = tm->tm_hour; tm->tm_min = tm->tm_hour;
tm->tm_hour = 0; tm->tm_hour = 0;
} }
else if (*cp == ':') else if (*cp == ':')
{ {
str = cp + 1;
errno = 0; errno = 0;
tm->tm_sec = strtoi(str, &cp, 10); tm->tm_sec = strtoi(cp + 1, &cp, 10);
if (errno == ERANGE) if (errno == ERANGE)
return DTERR_FIELD_OVERFLOW; return DTERR_FIELD_OVERFLOW;
if (*cp == '\0') if (*cp == '\0')
*fsec = 0; *fsec = 0;
else if (*cp == '.') else if (*cp == '.')
{ {
double frac; dterr = ParseFractionalSecond(cp, fsec);
if (dterr)
str = cp; return dterr;
frac = strtod(str, &cp);
if (*cp != '\0')
return DTERR_BAD_FORMAT;
#ifdef HAVE_INT64_TIMESTAMP
*fsec = rint(frac * 1000000);
#else
*fsec = frac;
#endif
} }
else else
return DTERR_BAD_FORMAT; return DTERR_BAD_FORMAT;
...@@ -2343,8 +2423,6 @@ DecodeNumber(int flen, char *str, bool haveTextMonth, int fmask, ...@@ -2343,8 +2423,6 @@ DecodeNumber(int flen, char *str, bool haveTextMonth, int fmask,
if (*cp == '.') if (*cp == '.')
{ {
double frac;
/* /*
* More than two digits before decimal point? Then could be a date or * More than two digits before decimal point? Then could be a date or
* a run-together time: 2001.360 20011225 040506.789 * a run-together time: 2001.360 20011225 040506.789
...@@ -2360,14 +2438,9 @@ DecodeNumber(int flen, char *str, bool haveTextMonth, int fmask, ...@@ -2360,14 +2438,9 @@ DecodeNumber(int flen, char *str, bool haveTextMonth, int fmask,
return 0; return 0;
} }
frac = strtod(cp, &cp); dterr = ParseFractionalSecond(cp, fsec);
if (*cp != '\0') if (dterr)
return DTERR_BAD_FORMAT; return dterr;
#ifdef HAVE_INT64_TIMESTAMP
*fsec = rint(frac * 1000000);
#else
*fsec = frac;
#endif
} }
else if (*cp != '\0') else if (*cp != '\0')
return DTERR_BAD_FORMAT; return DTERR_BAD_FORMAT;
...@@ -2528,14 +2601,22 @@ DecodeNumberField(int len, char *str, int fmask, ...@@ -2528,14 +2601,22 @@ DecodeNumberField(int len, char *str, int fmask,
*/ */
if ((cp = strchr(str, '.')) != NULL) if ((cp = strchr(str, '.')) != NULL)
{ {
/*
* Can we use ParseFractionalSecond here? Not clear whether
* trailing junk should be rejected ...
*/
double frac; double frac;
errno = 0;
frac = strtod(cp, NULL); frac = strtod(cp, NULL);
if (errno != 0)
return DTERR_BAD_FORMAT;
#ifdef HAVE_INT64_TIMESTAMP #ifdef HAVE_INT64_TIMESTAMP
*fsec = rint(frac * 1000000); *fsec = rint(frac * 1000000);
#else #else
*fsec = frac; *fsec = frac;
#endif #endif
/* Now truncate off the fraction for further processing */
*cp = '\0'; *cp = '\0';
len = strlen(str); len = strlen(str);
} }
...@@ -2723,6 +2804,23 @@ DecodeSpecial(int field, char *lowtoken, int *val) ...@@ -2723,6 +2804,23 @@ DecodeSpecial(int field, char *lowtoken, int *val)
} }
/* ClearPgTM
*
* Zero out a pg_tm and associated fsec_t
*/
static inline void
ClearPgTm(struct pg_tm *tm, fsec_t *fsec)
{
tm->tm_year = 0;
tm->tm_mon = 0;
tm->tm_mday = 0;
tm->tm_hour = 0;
tm->tm_min = 0;
tm->tm_sec = 0;
*fsec = 0;
}
/* DecodeInterval() /* DecodeInterval()
* Interpret previously parsed fields for general time interval. * Interpret previously parsed fields for general time interval.
* Returns 0 if successful, DTERR code if bogus input detected. * Returns 0 if successful, DTERR code if bogus input detected.
...@@ -2749,15 +2847,8 @@ DecodeInterval(char **field, int *ftype, int nf, int range, ...@@ -2749,15 +2847,8 @@ DecodeInterval(char **field, int *ftype, int nf, int range,
double fval; double fval;
*dtype = DTK_DELTA; *dtype = DTK_DELTA;
type = IGNORE_DTF; type = IGNORE_DTF;
tm->tm_year = 0; ClearPgTm(tm,fsec);
tm->tm_mon = 0;
tm->tm_mday = 0;
tm->tm_hour = 0;
tm->tm_min = 0;
tm->tm_sec = 0;
*fsec = 0;
/* read through list backwards to pick up units before values */ /* read through list backwards to pick up units before values */
for (i = nf - 1; i >= 0; i--) for (i = nf - 1; i >= 0; i--)
...@@ -2871,8 +2962,9 @@ DecodeInterval(char **field, int *ftype, int nf, int range, ...@@ -2871,8 +2962,9 @@ DecodeInterval(char **field, int *ftype, int nf, int range,
} }
else if (*cp == '.') else if (*cp == '.')
{ {
errno = 0;
fval = strtod(cp, &cp); fval = strtod(cp, &cp);
if (*cp != '\0') if (*cp != '\0' || errno != 0)
return DTERR_BAD_FORMAT; return DTERR_BAD_FORMAT;
if (*field[i] == '-') if (*field[i] == '-')
...@@ -2925,110 +3017,32 @@ DecodeInterval(char **field, int *ftype, int nf, int range, ...@@ -2925,110 +3017,32 @@ DecodeInterval(char **field, int *ftype, int nf, int range,
case DTK_MINUTE: case DTK_MINUTE:
tm->tm_min += val; tm->tm_min += val;
if (fval != 0) AdjustFractSeconds(fval, tm, fsec, SECS_PER_MINUTE);
{
int sec;
fval *= SECS_PER_MINUTE;
sec = fval;
tm->tm_sec += sec;
#ifdef HAVE_INT64_TIMESTAMP
*fsec += rint((fval - sec) * 1000000);
#else
*fsec += fval - sec;
#endif
}
tmask = DTK_M(MINUTE); tmask = DTK_M(MINUTE);
break; break;
case DTK_HOUR: case DTK_HOUR:
tm->tm_hour += val; tm->tm_hour += val;
if (fval != 0) AdjustFractSeconds(fval, tm, fsec, SECS_PER_HOUR);
{
int sec;
fval *= SECS_PER_HOUR;
sec = fval;
tm->tm_sec += sec;
#ifdef HAVE_INT64_TIMESTAMP
*fsec += rint((fval - sec) * 1000000);
#else
*fsec += fval - sec;
#endif
}
tmask = DTK_M(HOUR); tmask = DTK_M(HOUR);
type = DTK_DAY; type = DTK_DAY;
break; break;
case DTK_DAY: case DTK_DAY:
tm->tm_mday += val; tm->tm_mday += val;
if (fval != 0) AdjustFractSeconds(fval, tm, fsec, SECS_PER_DAY);
{
int sec;
fval *= SECS_PER_DAY;
sec = fval;
tm->tm_sec += sec;
#ifdef HAVE_INT64_TIMESTAMP
*fsec += rint((fval - sec) * 1000000);
#else
*fsec += fval - sec;
#endif
}
tmask = (fmask & DTK_M(DAY)) ? 0 : DTK_M(DAY); tmask = (fmask & DTK_M(DAY)) ? 0 : DTK_M(DAY);
break; break;
case DTK_WEEK: case DTK_WEEK:
tm->tm_mday += val * 7; tm->tm_mday += val * 7;
if (fval != 0) AdjustFractDays(fval, tm, fsec, 7);
{
int extra_days;
fval *= 7;
extra_days = (int32) fval;
tm->tm_mday += extra_days;
fval -= extra_days;
if (fval != 0)
{
int sec;
fval *= SECS_PER_DAY;
sec = fval;
tm->tm_sec += sec;
#ifdef HAVE_INT64_TIMESTAMP
*fsec += rint((fval - sec) * 1000000);
#else
*fsec += fval - sec;
#endif
}
}
tmask = (fmask & DTK_M(DAY)) ? 0 : DTK_M(DAY); tmask = (fmask & DTK_M(DAY)) ? 0 : DTK_M(DAY);
break; break;
case DTK_MONTH: case DTK_MONTH:
tm->tm_mon += val; tm->tm_mon += val;
if (fval != 0) AdjustFractDays(fval, tm, fsec, DAYS_PER_MONTH);
{
int day;
fval *= DAYS_PER_MONTH;
day = fval;
tm->tm_mday += day;
fval -= day;
if (fval != 0)
{
int sec;
fval *= SECS_PER_DAY;
sec = fval;
tm->tm_sec += sec;
#ifdef HAVE_INT64_TIMESTAMP
*fsec += rint((fval - sec) * 1000000);
#else
*fsec += fval - sec;
#endif
}
}
tmask = DTK_M(MONTH); tmask = DTK_M(MONTH);
break; break;
...@@ -3232,44 +3246,6 @@ ISO8601IntegerWidth(char *fieldstart) ...@@ -3232,44 +3246,6 @@ ISO8601IntegerWidth(char *fieldstart)
return strspn(fieldstart, "0123456789"); return strspn(fieldstart, "0123456789");
} }
/*
* Multiply frac by scale (to produce seconds) and add to *tm & *fsec.
* We assume the input frac is less than 1 so overflow is not an issue.
*/
static void
AdjustFractionalSeconds(double frac, struct pg_tm * tm, fsec_t *fsec,
int scale)
{
int sec;
if (frac == 0)
return;
frac *= scale;
sec = (int) frac;
tm->tm_sec += sec;
frac -= sec;
#ifdef HAVE_INT64_TIMESTAMP
*fsec += rint(frac * 1000000);
#else
*fsec += frac;
#endif
}
/* As above, but initial scale produces days */
static void
AdjustFractionalDays(double frac, struct pg_tm * tm, fsec_t *fsec, int scale)
{
int extra_days;
if (frac == 0)
return;
frac *= scale;
extra_days = (int) frac;
tm->tm_mday += extra_days;
frac -= extra_days;
AdjustFractionalSeconds(frac, tm, fsec, SECS_PER_DAY);
}
/* DecodeISO8601Interval() /* DecodeISO8601Interval()
* Decode an ISO 8601 time interval of the "format with designators" * Decode an ISO 8601 time interval of the "format with designators"
...@@ -3296,14 +3272,7 @@ DecodeISO8601Interval(char *str, ...@@ -3296,14 +3272,7 @@ DecodeISO8601Interval(char *str,
bool havefield = false; bool havefield = false;
*dtype = DTK_DELTA; *dtype = DTK_DELTA;
ClearPgTm(tm, fsec);
tm->tm_year = 0;
tm->tm_mon = 0;
tm->tm_mday = 0;
tm->tm_hour = 0;
tm->tm_min = 0;
tm->tm_sec = 0;
*fsec = 0;
if (strlen(str) < 2 || str[0] != 'P') if (strlen(str) < 2 || str[0] != 'P')
return DTERR_BAD_FORMAT; return DTERR_BAD_FORMAT;
...@@ -3346,15 +3315,15 @@ DecodeISO8601Interval(char *str, ...@@ -3346,15 +3315,15 @@ DecodeISO8601Interval(char *str,
break; break;
case 'M': case 'M':
tm->tm_mon += val; tm->tm_mon += val;
AdjustFractionalDays(fval, tm, fsec, DAYS_PER_MONTH); AdjustFractDays(fval, tm, fsec, DAYS_PER_MONTH);
break; break;
case 'W': case 'W':
tm->tm_mday += val * 7; tm->tm_mday += val * 7;
AdjustFractionalDays(fval, tm, fsec, 7); AdjustFractDays(fval, tm, fsec, 7);
break; break;
case 'D': case 'D':
tm->tm_mday += val; tm->tm_mday += val;
AdjustFractionalSeconds(fval, tm, fsec, SECS_PER_DAY); AdjustFractSeconds(fval, tm, fsec, SECS_PER_DAY);
break; break;
case 'T': /* ISO 8601 4.4.3.3 Alternative Format / Basic */ case 'T': /* ISO 8601 4.4.3.3 Alternative Format / Basic */
case '\0': case '\0':
...@@ -3363,7 +3332,7 @@ DecodeISO8601Interval(char *str, ...@@ -3363,7 +3332,7 @@ DecodeISO8601Interval(char *str,
tm->tm_year += val / 10000; tm->tm_year += val / 10000;
tm->tm_mon += (val / 100) % 100; tm->tm_mon += (val / 100) % 100;
tm->tm_mday += val % 100; tm->tm_mday += val % 100;
AdjustFractionalSeconds(fval, tm, fsec, SECS_PER_DAY); AdjustFractSeconds(fval, tm, fsec, SECS_PER_DAY);
if (unit == '\0') if (unit == '\0')
return 0; return 0;
datepart = false; datepart = false;
...@@ -3390,7 +3359,7 @@ DecodeISO8601Interval(char *str, ...@@ -3390,7 +3359,7 @@ DecodeISO8601Interval(char *str,
if (dterr) if (dterr)
return dterr; return dterr;
tm->tm_mon += val; tm->tm_mon += val;
AdjustFractionalDays(fval, tm, fsec, DAYS_PER_MONTH); AdjustFractDays(fval, tm, fsec, DAYS_PER_MONTH);
if (*str == '\0') if (*str == '\0')
return 0; return 0;
if (*str == 'T') if (*str == 'T')
...@@ -3407,7 +3376,7 @@ DecodeISO8601Interval(char *str, ...@@ -3407,7 +3376,7 @@ DecodeISO8601Interval(char *str,
if (dterr) if (dterr)
return dterr; return dterr;
tm->tm_mday += val; tm->tm_mday += val;
AdjustFractionalSeconds(fval, tm, fsec, SECS_PER_DAY); AdjustFractSeconds(fval, tm, fsec, SECS_PER_DAY);
if (*str == '\0') if (*str == '\0')
return 0; return 0;
if (*str == 'T') if (*str == 'T')
...@@ -3428,15 +3397,15 @@ DecodeISO8601Interval(char *str, ...@@ -3428,15 +3397,15 @@ DecodeISO8601Interval(char *str,
{ {
case 'H': case 'H':
tm->tm_hour += val; tm->tm_hour += val;
AdjustFractionalSeconds(fval, tm, fsec, SECS_PER_HOUR); AdjustFractSeconds(fval, tm, fsec, SECS_PER_HOUR);
break; break;
case 'M': case 'M':
tm->tm_min += val; tm->tm_min += val;
AdjustFractionalSeconds(fval, tm, fsec, SECS_PER_MINUTE); AdjustFractSeconds(fval, tm, fsec, SECS_PER_MINUTE);
break; break;
case 'S': case 'S':
tm->tm_sec += val; tm->tm_sec += val;
AdjustFractionalSeconds(fval, tm, fsec, 1); AdjustFractSeconds(fval, tm, fsec, 1);
break; break;
case '\0': /* ISO 8601 4.4.3.3 Alternative Format */ case '\0': /* ISO 8601 4.4.3.3 Alternative Format */
if (ISO8601IntegerWidth(fieldstart) == 6 && !havefield) if (ISO8601IntegerWidth(fieldstart) == 6 && !havefield)
...@@ -3444,7 +3413,7 @@ DecodeISO8601Interval(char *str, ...@@ -3444,7 +3413,7 @@ DecodeISO8601Interval(char *str,
tm->tm_hour += val / 10000; tm->tm_hour += val / 10000;
tm->tm_min += (val / 100) % 100; tm->tm_min += (val / 100) % 100;
tm->tm_sec += val % 100; tm->tm_sec += val % 100;
AdjustFractionalSeconds(fval, tm, fsec, 1); AdjustFractSeconds(fval, tm, fsec, 1);
return 0; return 0;
} }
/* Else fall through to extended alternative format */ /* Else fall through to extended alternative format */
...@@ -3453,7 +3422,7 @@ DecodeISO8601Interval(char *str, ...@@ -3453,7 +3422,7 @@ DecodeISO8601Interval(char *str,
return DTERR_BAD_FORMAT; return DTERR_BAD_FORMAT;
tm->tm_hour += val; tm->tm_hour += val;
AdjustFractionalSeconds(fval, tm, fsec, SECS_PER_HOUR); AdjustFractSeconds(fval, tm, fsec, SECS_PER_HOUR);
if (unit == '\0') if (unit == '\0')
return 0; return 0;
...@@ -3461,7 +3430,7 @@ DecodeISO8601Interval(char *str, ...@@ -3461,7 +3430,7 @@ DecodeISO8601Interval(char *str,
if (dterr) if (dterr)
return dterr; return dterr;
tm->tm_min += val; tm->tm_min += val;
AdjustFractionalSeconds(fval, tm, fsec, SECS_PER_MINUTE); AdjustFractSeconds(fval, tm, fsec, SECS_PER_MINUTE);
if (*str == '\0') if (*str == '\0')
return 0; return 0;
if (*str != ':') if (*str != ':')
...@@ -3472,7 +3441,7 @@ DecodeISO8601Interval(char *str, ...@@ -3472,7 +3441,7 @@ DecodeISO8601Interval(char *str,
if (dterr) if (dterr)
return dterr; return dterr;
tm->tm_sec += val; tm->tm_sec += val;
AdjustFractionalSeconds(fval, tm, fsec, 1); AdjustFractSeconds(fval, tm, fsec, 1);
if (*str == '\0') if (*str == '\0')
return 0; return 0;
return DTERR_BAD_FORMAT; return DTERR_BAD_FORMAT;
...@@ -3702,24 +3671,10 @@ EncodeTimeOnly(struct pg_tm * tm, fsec_t fsec, int *tzp, int style, char *str) ...@@ -3702,24 +3671,10 @@ EncodeTimeOnly(struct pg_tm * tm, fsec_t fsec, int *tzp, int style, char *str)
if (tm->tm_hour < 0 || tm->tm_hour > HOURS_PER_DAY) if (tm->tm_hour < 0 || tm->tm_hour > HOURS_PER_DAY)
return -1; return -1;
sprintf(str, "%02d:%02d", tm->tm_hour, tm->tm_min); sprintf(str, "%02d:%02d:", tm->tm_hour, tm->tm_min);
str += strlen(str);
/* AppendSeconds(str, tm->tm_sec, fsec, MAX_TIME_PRECISION, true);
* Print fractional seconds if any. The fractional field widths here
* should be equal to the larger of MAX_TIME_PRECISION and
* MAX_TIMESTAMP_PRECISION.
*/
if (fsec != 0)
{
#ifdef HAVE_INT64_TIMESTAMP
sprintf(str + strlen(str), ":%02d.%06d", tm->tm_sec, fsec);
#else
sprintf(str + strlen(str), ":%013.10f", tm->tm_sec + fsec);
#endif
TrimTrailingZeros(str);
}
else
sprintf(str + strlen(str), ":%02d", tm->tm_sec);
if (tzp != NULL) if (tzp != NULL)
EncodeTimezone(str, *tzp, style); EncodeTimezone(str, *tzp, style);
...@@ -3758,37 +3713,15 @@ EncodeDateTime(struct pg_tm * tm, fsec_t fsec, int *tzp, char **tzn, int style, ...@@ -3758,37 +3713,15 @@ EncodeDateTime(struct pg_tm * tm, fsec_t fsec, int *tzp, char **tzn, int style,
/* Compatible with ISO-8601 date formats */ /* Compatible with ISO-8601 date formats */
if (style == USE_ISO_DATES) if (style == USE_ISO_DATES)
sprintf(str, "%04d-%02d-%02d %02d:%02d", sprintf(str, "%04d-%02d-%02d %02d:%02d:",
(tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1), (tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1),
tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min); tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min);
else else
sprintf(str, "%04d-%02d-%02dT%02d:%02d", sprintf(str, "%04d-%02d-%02dT%02d:%02d:",
(tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1), (tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1),
tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min); tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min);
AppendTimestampSeconds(str + strlen(str), tm, fsec);
/*
* Print fractional seconds if any. The field widths here should
* be at least equal to MAX_TIMESTAMP_PRECISION.
*
* In float mode, don't print fractional seconds before 1 AD,
* since it's unlikely there's any precision left ...
*/
#ifdef HAVE_INT64_TIMESTAMP
if (fsec != 0)
{
sprintf(str + strlen(str), ":%02d.%06d", tm->tm_sec, fsec);
TrimTrailingZeros(str);
}
#else
if (fsec != 0 && tm->tm_year > 0)
{
sprintf(str + strlen(str), ":%09.6f", tm->tm_sec + fsec);
TrimTrailingZeros(str);
}
#endif
else
sprintf(str + strlen(str), ":%02d", tm->tm_sec);
/* /*
* tzp == NULL indicates that we don't want *any* time zone info * tzp == NULL indicates that we don't want *any* time zone info
...@@ -3811,32 +3744,11 @@ EncodeDateTime(struct pg_tm * tm, fsec_t fsec, int *tzp, char **tzn, int style, ...@@ -3811,32 +3744,11 @@ EncodeDateTime(struct pg_tm * tm, fsec_t fsec, int *tzp, char **tzn, int style,
else else
sprintf(str, "%02d/%02d", tm->tm_mon, tm->tm_mday); sprintf(str, "%02d/%02d", tm->tm_mon, tm->tm_mday);
sprintf(str + 5, "/%04d %02d:%02d", sprintf(str + 5, "/%04d %02d:%02d:",
(tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1), (tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1),
tm->tm_hour, tm->tm_min); tm->tm_hour, tm->tm_min);
/* AppendTimestampSeconds(str + strlen(str), tm, fsec);
* Print fractional seconds if any. The field widths here should
* be at least equal to MAX_TIMESTAMP_PRECISION.
*
* In float mode, don't print fractional seconds before 1 AD,
* since it's unlikely there's any precision left ...
*/
#ifdef HAVE_INT64_TIMESTAMP
if (fsec != 0)
{
sprintf(str + strlen(str), ":%02d.%06d", tm->tm_sec, fsec);
TrimTrailingZeros(str);
}
#else
if (fsec != 0 && tm->tm_year > 0)
{
sprintf(str + strlen(str), ":%09.6f", tm->tm_sec + fsec);
TrimTrailingZeros(str);
}
#endif
else
sprintf(str + strlen(str), ":%02d", tm->tm_sec);
if (tzp != NULL && tm->tm_isdst >= 0) if (tzp != NULL && tm->tm_isdst >= 0)
{ {
...@@ -3855,32 +3767,11 @@ EncodeDateTime(struct pg_tm * tm, fsec_t fsec, int *tzp, char **tzn, int style, ...@@ -3855,32 +3767,11 @@ EncodeDateTime(struct pg_tm * tm, fsec_t fsec, int *tzp, char **tzn, int style,
sprintf(str, "%02d.%02d", tm->tm_mday, tm->tm_mon); sprintf(str, "%02d.%02d", tm->tm_mday, tm->tm_mon);
sprintf(str + 5, ".%04d %02d:%02d", sprintf(str + 5, ".%04d %02d:%02d:",
(tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1), (tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1),
tm->tm_hour, tm->tm_min); tm->tm_hour, tm->tm_min);
/* AppendTimestampSeconds(str + strlen(str), tm, fsec);
* Print fractional seconds if any. The field widths here should
* be at least equal to MAX_TIMESTAMP_PRECISION.
*
* In float mode, don't print fractional seconds before 1 AD,
* since it's unlikely there's any precision left ...
*/
#ifdef HAVE_INT64_TIMESTAMP
if (fsec != 0)
{
sprintf(str + strlen(str), ":%02d.%06d", tm->tm_sec, fsec);
TrimTrailingZeros(str);
}
#else
if (fsec != 0 && tm->tm_year > 0)
{
sprintf(str + strlen(str), ":%09.6f", tm->tm_sec + fsec);
TrimTrailingZeros(str);
}
#endif
else
sprintf(str + strlen(str), ":%02d", tm->tm_sec);
if (tzp != NULL && tm->tm_isdst >= 0) if (tzp != NULL && tm->tm_isdst >= 0)
{ {
...@@ -3909,30 +3800,9 @@ EncodeDateTime(struct pg_tm * tm, fsec_t fsec, int *tzp, char **tzn, int style, ...@@ -3909,30 +3800,9 @@ EncodeDateTime(struct pg_tm * tm, fsec_t fsec, int *tzp, char **tzn, int style,
else else
sprintf(str + 4, "%3s %02d", months[tm->tm_mon - 1], tm->tm_mday); sprintf(str + 4, "%3s %02d", months[tm->tm_mon - 1], tm->tm_mday);
sprintf(str + 10, " %02d:%02d", tm->tm_hour, tm->tm_min); sprintf(str + 10, " %02d:%02d:", tm->tm_hour, tm->tm_min);
/* AppendTimestampSeconds(str + strlen(str), tm, fsec);
* Print fractional seconds if any. The field widths here should
* be at least equal to MAX_TIMESTAMP_PRECISION.
*
* In float mode, don't print fractional seconds before 1 AD,
* since it's unlikely there's any precision left ...
*/
#ifdef HAVE_INT64_TIMESTAMP
if (fsec != 0)
{
sprintf(str + strlen(str), ":%02d.%06d", tm->tm_sec, fsec);
TrimTrailingZeros(str);
}
#else
if (fsec != 0 && tm->tm_year > 0)
{
sprintf(str + strlen(str), ":%09.6f", tm->tm_sec + fsec);
TrimTrailingZeros(str);
}
#endif
else
sprintf(str + strlen(str), ":%02d", tm->tm_sec);
sprintf(str + strlen(str), " %04d", sprintf(str + strlen(str), " %04d",
(tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1)); (tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1));
...@@ -3965,35 +3835,57 @@ EncodeDateTime(struct pg_tm * tm, fsec_t fsec, int *tzp, char **tzn, int style, ...@@ -3965,35 +3835,57 @@ EncodeDateTime(struct pg_tm * tm, fsec_t fsec, int *tzp, char **tzn, int style,
/* /*
* Helper functions to avoid duplicated code in EncodeInterval. * Helper functions to avoid duplicated code in EncodeInterval.
*
* Append sections and fractional seconds (if any) at *cp.
* Note that any sign is stripped from the input seconds values.
*/ */
static void
AppendSeconds(char *cp, int sec, fsec_t fsec, bool fillzeros) /* Append an ISO-8601-style interval field, but only if value isn't zero */
static char *
AddISO8601IntPart(char *cp, int value, char units)
{ {
if (fsec == 0) if (value == 0)
{ return cp;
sprintf(cp, fillzeros ? "%02d" : "%d", abs(sec)); sprintf(cp, "%d%c", value, units);
} return cp + strlen(cp);
else
{
#ifdef HAVE_INT64_TIMESTAMP
sprintf(cp, fillzeros ? "%02d.%06d" : "%d.%06d", abs(sec), Abs(fsec));
#else
sprintf(cp, fillzeros ? "%012.9f" : "%.9f", fabs(sec + fsec));
#endif
TrimTrailingZeros(cp);
}
} }
/* Append an ISO8601 field, but only if value isn't zero */ /* Append a postgres-style interval field, but only if value isn't zero */
static char * static char *
AddISO8601IntervalPart(char *cp, int value, char units) AddPostgresIntPart(char *cp, int value, const char *units,
bool *is_zero, bool *is_before)
{ {
if (value == 0) if (value == 0)
return cp; return cp;
sprintf(cp, "%d%c", value, units); sprintf(cp, "%s%s%d %s%s",
(!*is_zero) ? " " : "",
(*is_before && value > 0) ? "+" : "",
value,
units,
(value != 1) ? "s" : "");
/*
* Each nonzero field sets is_before for (only) the next one. This is
* a tad bizarre but it's how it worked before...
*/
*is_before = (value < 0);
*is_zero = FALSE;
return cp + strlen(cp);
}
/* Append a verbose-style interval field, but only if value isn't zero */
static char *
AddVerboseIntPart(char *cp, int value, const char *units,
bool *is_zero, bool *is_before)
{
if (value == 0)
return cp;
/* first nonzero value sets is_before */
if (*is_zero)
{
*is_before = (value < 0);
value = abs(value);
}
else if (*is_before)
value = -value;
sprintf(cp, " %d %s%s", value, units, (value == 1) ? "" : "s");
*is_zero = FALSE;
return cp + strlen(cp); return cp + strlen(cp);
} }
...@@ -4028,12 +3920,12 @@ EncodeInterval(struct pg_tm * tm, fsec_t fsec, int style, char *str) ...@@ -4028,12 +3920,12 @@ EncodeInterval(struct pg_tm * tm, fsec_t fsec, int style, char *str)
int min = tm->tm_min; int min = tm->tm_min;
int sec = tm->tm_sec; int sec = tm->tm_sec;
bool is_before = FALSE; bool is_before = FALSE;
bool is_nonzero = FALSE; bool is_zero = TRUE;
/* /*
* The sign of year and month are guaranteed to match, since they are * The sign of year and month are guaranteed to match, since they are
* stored internally as "month". But we'll need to check for is_before and * stored internally as "month". But we'll need to check for is_before and
* is_nonzero when determining the signs of day and hour/minute/seconds * is_zero when determining the signs of day and hour/minute/seconds
* fields. * fields.
*/ */
switch (style) switch (style)
...@@ -4084,14 +3976,15 @@ EncodeInterval(struct pg_tm * tm, fsec_t fsec, int style, char *str) ...@@ -4084,14 +3976,15 @@ EncodeInterval(struct pg_tm * tm, fsec_t fsec, int style, char *str)
*/ */
char year_sign = (year < 0 || mon < 0) ? '-' : '+'; char year_sign = (year < 0 || mon < 0) ? '-' : '+';
char day_sign = (mday < 0) ? '-' : '+'; char day_sign = (mday < 0) ? '-' : '+';
char sec_sign = (hour < 0 || min < 0 || sec < 0 || fsec < 0) ? '-' : '+'; char sec_sign = (hour < 0 || min < 0 ||
sec < 0 || fsec < 0) ? '-' : '+';
sprintf(cp, "%c%d-%d %c%d %c%d:%02d:", sprintf(cp, "%c%d-%d %c%d %c%d:%02d:",
year_sign, abs(year), abs(mon), year_sign, abs(year), abs(mon),
day_sign, abs(mday), day_sign, abs(mday),
sec_sign, abs(hour), abs(min)); sec_sign, abs(hour), abs(min));
cp += strlen(cp); cp += strlen(cp);
AppendSeconds(cp, sec, fsec, true); AppendSeconds(cp, sec, fsec, MAX_INTERVAL_PRECISION, true);
} }
else if (has_year_month) else if (has_year_month)
{ {
...@@ -4101,13 +3994,13 @@ EncodeInterval(struct pg_tm * tm, fsec_t fsec, int style, char *str) ...@@ -4101,13 +3994,13 @@ EncodeInterval(struct pg_tm * tm, fsec_t fsec, int style, char *str)
{ {
sprintf(cp, "%d %d:%02d:", mday, hour, min); sprintf(cp, "%d %d:%02d:", mday, hour, min);
cp += strlen(cp); cp += strlen(cp);
AppendSeconds(cp, sec, fsec, true); AppendSeconds(cp, sec, fsec, MAX_INTERVAL_PRECISION, true);
} }
else else
{ {
sprintf(cp, "%d:%02d:", hour, min); sprintf(cp, "%d:%02d:", hour, min);
cp += strlen(cp); cp += strlen(cp);
AppendSeconds(cp, sec, fsec, true); AppendSeconds(cp, sec, fsec, MAX_INTERVAL_PRECISION, true);
} }
} }
break; break;
...@@ -4122,18 +4015,18 @@ EncodeInterval(struct pg_tm * tm, fsec_t fsec, int style, char *str) ...@@ -4122,18 +4015,18 @@ EncodeInterval(struct pg_tm * tm, fsec_t fsec, int style, char *str)
break; break;
} }
*cp++ = 'P'; *cp++ = 'P';
cp = AddISO8601IntervalPart(cp, year, 'Y'); cp = AddISO8601IntPart(cp, year, 'Y');
cp = AddISO8601IntervalPart(cp, mon , 'M'); cp = AddISO8601IntPart(cp, mon , 'M');
cp = AddISO8601IntervalPart(cp, mday, 'D'); cp = AddISO8601IntPart(cp, mday, 'D');
if (hour != 0 || min != 0 || sec != 0 || fsec != 0) if (hour != 0 || min != 0 || sec != 0 || fsec != 0)
*cp++ = 'T'; *cp++ = 'T';
cp = AddISO8601IntervalPart(cp, hour, 'H'); cp = AddISO8601IntPart(cp, hour, 'H');
cp = AddISO8601IntervalPart(cp, min , 'M'); cp = AddISO8601IntPart(cp, min , 'M');
if (sec != 0 || fsec != 0) if (sec != 0 || fsec != 0)
{ {
if (sec < 0 || fsec < 0) if (sec < 0 || fsec < 0)
*cp++ = '-'; *cp++ = '-';
AppendSeconds(cp, sec, fsec, false); AppendSeconds(cp, sec, fsec, MAX_INTERVAL_PRECISION, false);
cp += strlen(cp); cp += strlen(cp);
*cp++ = 'S'; *cp++ = 'S';
*cp++ = '\0'; *cp++ = '\0';
...@@ -4142,196 +4035,55 @@ EncodeInterval(struct pg_tm * tm, fsec_t fsec, int style, char *str) ...@@ -4142,196 +4035,55 @@ EncodeInterval(struct pg_tm * tm, fsec_t fsec, int style, char *str)
/* Compatible with postgresql < 8.4 when DateStyle = 'iso' */ /* Compatible with postgresql < 8.4 when DateStyle = 'iso' */
case INTSTYLE_POSTGRES: case INTSTYLE_POSTGRES:
if (tm->tm_year != 0) cp = AddPostgresIntPart(cp, year, "year", &is_zero, &is_before);
{ cp = AddPostgresIntPart(cp, mon, "mon", &is_zero, &is_before);
sprintf(cp, "%d year%s", cp = AddPostgresIntPart(cp, mday, "day", &is_zero, &is_before);
tm->tm_year, (tm->tm_year != 1) ? "s" : ""); if (is_zero || hour != 0 || min != 0 || sec != 0 || fsec != 0)
cp += strlen(cp);
is_before = (tm->tm_year < 0);
is_nonzero = TRUE;
}
if (tm->tm_mon != 0)
{
sprintf(cp, "%s%s%d mon%s", is_nonzero ? " " : "",
(is_before && tm->tm_mon > 0) ? "+" : "",
tm->tm_mon, (tm->tm_mon != 1) ? "s" : "");
cp += strlen(cp);
is_before = (tm->tm_mon < 0);
is_nonzero = TRUE;
}
if (tm->tm_mday != 0)
{
sprintf(cp, "%s%s%d day%s", is_nonzero ? " " : "",
(is_before && tm->tm_mday > 0) ? "+" : "",
tm->tm_mday, (tm->tm_mday != 1) ? "s" : "");
cp += strlen(cp);
is_before = (tm->tm_mday < 0);
is_nonzero = TRUE;
}
if (!is_nonzero || tm->tm_hour != 0 || tm->tm_min != 0 ||
tm->tm_sec != 0 || fsec != 0)
{ {
int minus = (tm->tm_hour < 0 || tm->tm_min < 0 || bool minus = (hour < 0 || min < 0 || sec < 0 || fsec < 0);
tm->tm_sec < 0 || fsec < 0);
sprintf(cp, "%s%s%02d:%02d:", is_nonzero ? " " : "", sprintf(cp, "%s%s%02d:%02d:",
is_zero ? "" : " ",
(minus ? "-" : (is_before ? "+" : "")), (minus ? "-" : (is_before ? "+" : "")),
abs(tm->tm_hour), abs(tm->tm_min)); abs(hour), abs(min));
cp += strlen(cp);
AppendSeconds(cp, tm->tm_sec, fsec, true);
cp += strlen(cp);
is_nonzero = TRUE;
}
/* identically zero? then put in a unitless zero... */
if (!is_nonzero)
{
strcat(cp, "0");
cp += strlen(cp); cp += strlen(cp);
AppendSeconds(cp, sec, fsec, MAX_INTERVAL_PRECISION, true);
} }
break; break;
/* Compatible with postgresql < 8.4 when DateStyle != 'iso' */ /* Compatible with postgresql < 8.4 when DateStyle != 'iso' */
case INTSTYLE_POSTGRES_VERBOSE: case INTSTYLE_POSTGRES_VERBOSE:
default: default:
strcpy(cp, "@ "); strcpy(cp, "@");
cp += strlen(cp); cp++;
cp = AddVerboseIntPart(cp, year, "year", &is_zero, &is_before);
if (tm->tm_year != 0) cp = AddVerboseIntPart(cp, mon, "mon", &is_zero, &is_before);
{ cp = AddVerboseIntPart(cp, mday, "day", &is_zero, &is_before);
int year = tm->tm_year; cp = AddVerboseIntPart(cp, hour, "hour", &is_zero, &is_before);
cp = AddVerboseIntPart(cp, min, "min", &is_zero, &is_before);
if (tm->tm_year < 0) if (sec != 0 || fsec != 0)
year = -year;
sprintf(cp, "%d year%s", year,
(year != 1) ? "s" : "");
cp += strlen(cp);
is_before = (tm->tm_year < 0);
is_nonzero = TRUE;
}
if (tm->tm_mon != 0)
{
int mon = tm->tm_mon;
if (is_before || (!is_nonzero && tm->tm_mon < 0))
mon = -mon;
sprintf(cp, "%s%d mon%s", is_nonzero ? " " : "", mon,
(mon != 1) ? "s" : "");
cp += strlen(cp);
if (!is_nonzero)
is_before = (tm->tm_mon < 0);
is_nonzero = TRUE;
}
if (tm->tm_mday != 0)
{
int day = tm->tm_mday;
if (is_before || (!is_nonzero && tm->tm_mday < 0))
day = -day;
sprintf(cp, "%s%d day%s", is_nonzero ? " " : "", day,
(day != 1) ? "s" : "");
cp += strlen(cp);
if (!is_nonzero)
is_before = (tm->tm_mday < 0);
is_nonzero = TRUE;
}
if (tm->tm_hour != 0)
{
int hour = tm->tm_hour;
if (is_before || (!is_nonzero && tm->tm_hour < 0))
hour = -hour;
sprintf(cp, "%s%d hour%s", is_nonzero ? " " : "", hour,
(hour != 1) ? "s" : "");
cp += strlen(cp);
if (!is_nonzero)
is_before = (tm->tm_hour < 0);
is_nonzero = TRUE;
}
if (tm->tm_min != 0)
{
int min = tm->tm_min;
if (is_before || (!is_nonzero && tm->tm_min < 0))
min = -min;
sprintf(cp, "%s%d min%s", is_nonzero ? " " : "", min,
(min != 1) ? "s" : "");
cp += strlen(cp);
if (!is_nonzero)
is_before = (tm->tm_min < 0);
is_nonzero = TRUE;
}
/* fractional seconds? */
if (fsec != 0)
{ {
fsec_t sec; *cp++ = ' ';
if (sec < 0 || (sec == 0 && fsec < 0))
#ifdef HAVE_INT64_TIMESTAMP
sec = fsec;
if (is_before || (!is_nonzero && tm->tm_sec < 0))
{
tm->tm_sec = -tm->tm_sec;
sec = -sec;
is_before = TRUE;
}
else if (!is_nonzero && tm->tm_sec == 0 && fsec < 0)
{ {
sec = -sec; if (is_zero)
is_before = TRUE; is_before = TRUE;
else if (!is_before)
*cp++ = '-';
} }
sprintf(cp, "%s%d.%02d secs", is_nonzero ? " " : "", else if (is_before)
tm->tm_sec, abs((int) rint(sec / 10000.0))); *cp++ = '-';
cp += strlen(cp); AppendSeconds(cp, sec, fsec, MAX_INTERVAL_PRECISION, false);
#else
fsec += tm->tm_sec;
sec = fsec;
if (is_before || (!is_nonzero && fsec < 0))
sec = -sec;
sprintf(cp, "%s%.2f secs", is_nonzero ? " " : "", sec);
cp += strlen(cp);
if (!is_nonzero)
is_before = (fsec < 0);
#endif
is_nonzero = TRUE;
}
/* otherwise, integer seconds only? */
else if (tm->tm_sec != 0)
{
int sec = tm->tm_sec;
if (is_before || (!is_nonzero && tm->tm_sec < 0))
sec = -sec;
sprintf(cp, "%s%d sec%s", is_nonzero ? " " : "", sec,
(sec != 1) ? "s" : "");
cp += strlen(cp); cp += strlen(cp);
if (!is_nonzero) sprintf(cp, " sec%s",
is_before = (tm->tm_sec < 0); (abs(sec) != 1 || fsec != 0) ? "s" : "");
is_nonzero = TRUE; is_zero = FALSE;
} }
/* identically zero? then put in a unitless zero... */ /* identically zero? then put in a unitless zero... */
if (!is_nonzero) if (is_zero)
{ strcat(cp, " 0");
strcat(cp, "0");
cp += strlen(cp);
}
if (is_before) if (is_before)
{
strcat(cp, " ago"); strcat(cp, " ago");
cp += strlen(cp);
}
break; break;
} }
......
...@@ -423,9 +423,9 @@ SELECT '' AS "64", d1 + interval '1 year' AS one_year FROM TIMESTAMP_TBL; ...@@ -423,9 +423,9 @@ SELECT '' AS "64", d1 + interval '1 year' AS one_year FROM TIMESTAMP_TBL;
| Tue Feb 10 17:32:01 1998 | Tue Feb 10 17:32:01 1998
| Tue Feb 10 17:32:01 1998 | Tue Feb 10 17:32:01 1998
| Tue Feb 10 17:32:02 1998 | Tue Feb 10 17:32:02 1998
| Tue Feb 10 17:32:01.40 1998 | Tue Feb 10 17:32:01.4 1998
| Tue Feb 10 17:32:01.50 1998 | Tue Feb 10 17:32:01.5 1998
| Tue Feb 10 17:32:01.60 1998 | Tue Feb 10 17:32:01.6 1998
| Fri Jan 02 00:00:00 1998 | Fri Jan 02 00:00:00 1998
| Fri Jan 02 03:04:05 1998 | Fri Jan 02 03:04:05 1998
| Tue Feb 10 17:32:01 1998 | Tue Feb 10 17:32:01 1998
...@@ -493,9 +493,9 @@ SELECT '' AS "64", d1 - interval '1 year' AS one_year FROM TIMESTAMP_TBL; ...@@ -493,9 +493,9 @@ SELECT '' AS "64", d1 - interval '1 year' AS one_year FROM TIMESTAMP_TBL;
| Sat Feb 10 17:32:01 1996 | Sat Feb 10 17:32:01 1996
| Sat Feb 10 17:32:01 1996 | Sat Feb 10 17:32:01 1996
| Sat Feb 10 17:32:02 1996 | Sat Feb 10 17:32:02 1996
| Sat Feb 10 17:32:01.40 1996 | Sat Feb 10 17:32:01.4 1996
| Sat Feb 10 17:32:01.50 1996 | Sat Feb 10 17:32:01.5 1996
| Sat Feb 10 17:32:01.60 1996 | Sat Feb 10 17:32:01.6 1996
| Tue Jan 02 00:00:00 1996 | Tue Jan 02 00:00:00 1996
| Tue Jan 02 03:04:05 1996 | Tue Jan 02 03:04:05 1996
| Sat Feb 10 17:32:01 1996 | Sat Feb 10 17:32:01 1996
...@@ -668,9 +668,9 @@ SELECT '' AS "64", d1 + interval '1 year' AS one_year FROM TIMESTAMPTZ_TBL; ...@@ -668,9 +668,9 @@ SELECT '' AS "64", d1 + interval '1 year' AS one_year FROM TIMESTAMPTZ_TBL;
| Tue Feb 10 17:32:01 1998 PST | Tue Feb 10 17:32:01 1998 PST
| Tue Feb 10 17:32:01 1998 PST | Tue Feb 10 17:32:01 1998 PST
| Tue Feb 10 17:32:02 1998 PST | Tue Feb 10 17:32:02 1998 PST
| Tue Feb 10 17:32:01.40 1998 PST | Tue Feb 10 17:32:01.4 1998 PST
| Tue Feb 10 17:32:01.50 1998 PST | Tue Feb 10 17:32:01.5 1998 PST
| Tue Feb 10 17:32:01.60 1998 PST | Tue Feb 10 17:32:01.6 1998 PST
| Fri Jan 02 00:00:00 1998 PST | Fri Jan 02 00:00:00 1998 PST
| Fri Jan 02 03:04:05 1998 PST | Fri Jan 02 03:04:05 1998 PST
| Tue Feb 10 17:32:01 1998 PST | Tue Feb 10 17:32:01 1998 PST
...@@ -739,9 +739,9 @@ SELECT '' AS "64", d1 - interval '1 year' AS one_year FROM TIMESTAMPTZ_TBL; ...@@ -739,9 +739,9 @@ SELECT '' AS "64", d1 - interval '1 year' AS one_year FROM TIMESTAMPTZ_TBL;
| Sat Feb 10 17:32:01 1996 PST | Sat Feb 10 17:32:01 1996 PST
| Sat Feb 10 17:32:01 1996 PST | Sat Feb 10 17:32:01 1996 PST
| Sat Feb 10 17:32:02 1996 PST | Sat Feb 10 17:32:02 1996 PST
| Sat Feb 10 17:32:01.40 1996 PST | Sat Feb 10 17:32:01.4 1996 PST
| Sat Feb 10 17:32:01.50 1996 PST | Sat Feb 10 17:32:01.5 1996 PST
| Sat Feb 10 17:32:01.60 1996 PST | Sat Feb 10 17:32:01.6 1996 PST
| Tue Jan 02 00:00:00 1996 PST | Tue Jan 02 00:00:00 1996 PST
| Tue Jan 02 03:04:05 1996 PST | Tue Jan 02 03:04:05 1996 PST
| Sat Feb 10 17:32:01 1996 PST | Sat Feb 10 17:32:01 1996 PST
...@@ -884,112 +884,112 @@ SELECT t.d1 AS t, i.f1 AS i, t.d1 + i.f1 AS "add", t.d1 - i.f1 AS "subtract" ...@@ -884,112 +884,112 @@ SELECT t.d1 AS t, i.f1 AS i, t.d1 + i.f1 AS "add", t.d1 - i.f1 AS "subtract"
WHERE t.d1 BETWEEN '1990-01-01' AND '2001-01-01' WHERE t.d1 BETWEEN '1990-01-01' AND '2001-01-01'
AND i.f1 BETWEEN '00:00' AND '23:00' AND i.f1 BETWEEN '00:00' AND '23:00'
ORDER BY 1,2; ORDER BY 1,2;
t | i | add | subtract t | i | add | subtract
-----------------------------+-----------+-----------------------------+----------------------------- ----------------------------+-----------+----------------------------+----------------------------
Wed Feb 28 17:32:01 1996 | @ 1 min | Wed Feb 28 17:33:01 1996 | Wed Feb 28 17:31:01 1996 Wed Feb 28 17:32:01 1996 | @ 1 min | Wed Feb 28 17:33:01 1996 | Wed Feb 28 17:31:01 1996
Wed Feb 28 17:32:01 1996 | @ 5 hours | Wed Feb 28 22:32:01 1996 | Wed Feb 28 12:32:01 1996 Wed Feb 28 17:32:01 1996 | @ 5 hours | Wed Feb 28 22:32:01 1996 | Wed Feb 28 12:32:01 1996
Thu Feb 29 17:32:01 1996 | @ 1 min | Thu Feb 29 17:33:01 1996 | Thu Feb 29 17:31:01 1996 Thu Feb 29 17:32:01 1996 | @ 1 min | Thu Feb 29 17:33:01 1996 | Thu Feb 29 17:31:01 1996
Thu Feb 29 17:32:01 1996 | @ 5 hours | Thu Feb 29 22:32:01 1996 | Thu Feb 29 12:32:01 1996 Thu Feb 29 17:32:01 1996 | @ 5 hours | Thu Feb 29 22:32:01 1996 | Thu Feb 29 12:32:01 1996
Fri Mar 01 17:32:01 1996 | @ 1 min | Fri Mar 01 17:33:01 1996 | Fri Mar 01 17:31:01 1996 Fri Mar 01 17:32:01 1996 | @ 1 min | Fri Mar 01 17:33:01 1996 | Fri Mar 01 17:31:01 1996
Fri Mar 01 17:32:01 1996 | @ 5 hours | Fri Mar 01 22:32:01 1996 | Fri Mar 01 12:32:01 1996 Fri Mar 01 17:32:01 1996 | @ 5 hours | Fri Mar 01 22:32:01 1996 | Fri Mar 01 12:32:01 1996
Mon Dec 30 17:32:01 1996 | @ 1 min | Mon Dec 30 17:33:01 1996 | Mon Dec 30 17:31:01 1996 Mon Dec 30 17:32:01 1996 | @ 1 min | Mon Dec 30 17:33:01 1996 | Mon Dec 30 17:31:01 1996
Mon Dec 30 17:32:01 1996 | @ 5 hours | Mon Dec 30 22:32:01 1996 | Mon Dec 30 12:32:01 1996 Mon Dec 30 17:32:01 1996 | @ 5 hours | Mon Dec 30 22:32:01 1996 | Mon Dec 30 12:32:01 1996
Tue Dec 31 17:32:01 1996 | @ 1 min | Tue Dec 31 17:33:01 1996 | Tue Dec 31 17:31:01 1996 Tue Dec 31 17:32:01 1996 | @ 1 min | Tue Dec 31 17:33:01 1996 | Tue Dec 31 17:31:01 1996
Tue Dec 31 17:32:01 1996 | @ 5 hours | Tue Dec 31 22:32:01 1996 | Tue Dec 31 12:32:01 1996 Tue Dec 31 17:32:01 1996 | @ 5 hours | Tue Dec 31 22:32:01 1996 | Tue Dec 31 12:32:01 1996
Wed Jan 01 17:32:01 1997 | @ 1 min | Wed Jan 01 17:33:01 1997 | Wed Jan 01 17:31:01 1997 Wed Jan 01 17:32:01 1997 | @ 1 min | Wed Jan 01 17:33:01 1997 | Wed Jan 01 17:31:01 1997
Wed Jan 01 17:32:01 1997 | @ 5 hours | Wed Jan 01 22:32:01 1997 | Wed Jan 01 12:32:01 1997 Wed Jan 01 17:32:01 1997 | @ 5 hours | Wed Jan 01 22:32:01 1997 | Wed Jan 01 12:32:01 1997
Thu Jan 02 00:00:00 1997 | @ 1 min | Thu Jan 02 00:01:00 1997 | Wed Jan 01 23:59:00 1997 Thu Jan 02 00:00:00 1997 | @ 1 min | Thu Jan 02 00:01:00 1997 | Wed Jan 01 23:59:00 1997
Thu Jan 02 00:00:00 1997 | @ 5 hours | Thu Jan 02 05:00:00 1997 | Wed Jan 01 19:00:00 1997 Thu Jan 02 00:00:00 1997 | @ 5 hours | Thu Jan 02 05:00:00 1997 | Wed Jan 01 19:00:00 1997
Thu Jan 02 03:04:05 1997 | @ 1 min | Thu Jan 02 03:05:05 1997 | Thu Jan 02 03:03:05 1997 Thu Jan 02 03:04:05 1997 | @ 1 min | Thu Jan 02 03:05:05 1997 | Thu Jan 02 03:03:05 1997
Thu Jan 02 03:04:05 1997 | @ 5 hours | Thu Jan 02 08:04:05 1997 | Wed Jan 01 22:04:05 1997 Thu Jan 02 03:04:05 1997 | @ 5 hours | Thu Jan 02 08:04:05 1997 | Wed Jan 01 22:04:05 1997
Mon Feb 10 17:32:00 1997 | @ 1 min | Mon Feb 10 17:33:00 1997 | Mon Feb 10 17:31:00 1997 Mon Feb 10 17:32:00 1997 | @ 1 min | Mon Feb 10 17:33:00 1997 | Mon Feb 10 17:31:00 1997
Mon Feb 10 17:32:00 1997 | @ 5 hours | Mon Feb 10 22:32:00 1997 | Mon Feb 10 12:32:00 1997 Mon Feb 10 17:32:00 1997 | @ 5 hours | Mon Feb 10 22:32:00 1997 | Mon Feb 10 12:32:00 1997
Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997
Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997
Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997
Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997
Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997
Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997
Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997
Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997
Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997
Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997
Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997
Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997
Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997
Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997
Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997
Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997
Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997
Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997 Mon Feb 10 17:32:01 1997 | @ 1 min | Mon Feb 10 17:33:01 1997 | Mon Feb 10 17:31:01 1997
Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997
Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997
Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997
Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997
Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997
Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997
Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997
Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997
Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997
Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997
Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997
Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997
Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997
Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997
Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997
Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997
Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997
Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997 Mon Feb 10 17:32:01 1997 | @ 5 hours | Mon Feb 10 22:32:01 1997 | Mon Feb 10 12:32:01 1997
Mon Feb 10 17:32:01.40 1997 | @ 1 min | Mon Feb 10 17:33:01.40 1997 | Mon Feb 10 17:31:01.40 1997 Mon Feb 10 17:32:01.4 1997 | @ 1 min | Mon Feb 10 17:33:01.4 1997 | Mon Feb 10 17:31:01.4 1997
Mon Feb 10 17:32:01.40 1997 | @ 5 hours | Mon Feb 10 22:32:01.40 1997 | Mon Feb 10 12:32:01.40 1997 Mon Feb 10 17:32:01.4 1997 | @ 5 hours | Mon Feb 10 22:32:01.4 1997 | Mon Feb 10 12:32:01.4 1997
Mon Feb 10 17:32:01.50 1997 | @ 1 min | Mon Feb 10 17:33:01.50 1997 | Mon Feb 10 17:31:01.50 1997 Mon Feb 10 17:32:01.5 1997 | @ 1 min | Mon Feb 10 17:33:01.5 1997 | Mon Feb 10 17:31:01.5 1997
Mon Feb 10 17:32:01.50 1997 | @ 5 hours | Mon Feb 10 22:32:01.50 1997 | Mon Feb 10 12:32:01.50 1997 Mon Feb 10 17:32:01.5 1997 | @ 5 hours | Mon Feb 10 22:32:01.5 1997 | Mon Feb 10 12:32:01.5 1997
Mon Feb 10 17:32:01.60 1997 | @ 1 min | Mon Feb 10 17:33:01.60 1997 | Mon Feb 10 17:31:01.60 1997 Mon Feb 10 17:32:01.6 1997 | @ 1 min | Mon Feb 10 17:33:01.6 1997 | Mon Feb 10 17:31:01.6 1997
Mon Feb 10 17:32:01.60 1997 | @ 5 hours | Mon Feb 10 22:32:01.60 1997 | Mon Feb 10 12:32:01.60 1997 Mon Feb 10 17:32:01.6 1997 | @ 5 hours | Mon Feb 10 22:32:01.6 1997 | Mon Feb 10 12:32:01.6 1997
Mon Feb 10 17:32:02 1997 | @ 1 min | Mon Feb 10 17:33:02 1997 | Mon Feb 10 17:31:02 1997 Mon Feb 10 17:32:02 1997 | @ 1 min | Mon Feb 10 17:33:02 1997 | Mon Feb 10 17:31:02 1997
Mon Feb 10 17:32:02 1997 | @ 5 hours | Mon Feb 10 22:32:02 1997 | Mon Feb 10 12:32:02 1997 Mon Feb 10 17:32:02 1997 | @ 5 hours | Mon Feb 10 22:32:02 1997 | Mon Feb 10 12:32:02 1997
Tue Feb 11 17:32:01 1997 | @ 1 min | Tue Feb 11 17:33:01 1997 | Tue Feb 11 17:31:01 1997 Tue Feb 11 17:32:01 1997 | @ 1 min | Tue Feb 11 17:33:01 1997 | Tue Feb 11 17:31:01 1997
Tue Feb 11 17:32:01 1997 | @ 5 hours | Tue Feb 11 22:32:01 1997 | Tue Feb 11 12:32:01 1997 Tue Feb 11 17:32:01 1997 | @ 5 hours | Tue Feb 11 22:32:01 1997 | Tue Feb 11 12:32:01 1997
Wed Feb 12 17:32:01 1997 | @ 1 min | Wed Feb 12 17:33:01 1997 | Wed Feb 12 17:31:01 1997 Wed Feb 12 17:32:01 1997 | @ 1 min | Wed Feb 12 17:33:01 1997 | Wed Feb 12 17:31:01 1997
Wed Feb 12 17:32:01 1997 | @ 5 hours | Wed Feb 12 22:32:01 1997 | Wed Feb 12 12:32:01 1997 Wed Feb 12 17:32:01 1997 | @ 5 hours | Wed Feb 12 22:32:01 1997 | Wed Feb 12 12:32:01 1997
Thu Feb 13 17:32:01 1997 | @ 1 min | Thu Feb 13 17:33:01 1997 | Thu Feb 13 17:31:01 1997 Thu Feb 13 17:32:01 1997 | @ 1 min | Thu Feb 13 17:33:01 1997 | Thu Feb 13 17:31:01 1997
Thu Feb 13 17:32:01 1997 | @ 5 hours | Thu Feb 13 22:32:01 1997 | Thu Feb 13 12:32:01 1997 Thu Feb 13 17:32:01 1997 | @ 5 hours | Thu Feb 13 22:32:01 1997 | Thu Feb 13 12:32:01 1997
Fri Feb 14 17:32:01 1997 | @ 1 min | Fri Feb 14 17:33:01 1997 | Fri Feb 14 17:31:01 1997 Fri Feb 14 17:32:01 1997 | @ 1 min | Fri Feb 14 17:33:01 1997 | Fri Feb 14 17:31:01 1997
Fri Feb 14 17:32:01 1997 | @ 5 hours | Fri Feb 14 22:32:01 1997 | Fri Feb 14 12:32:01 1997 Fri Feb 14 17:32:01 1997 | @ 5 hours | Fri Feb 14 22:32:01 1997 | Fri Feb 14 12:32:01 1997
Sat Feb 15 17:32:01 1997 | @ 1 min | Sat Feb 15 17:33:01 1997 | Sat Feb 15 17:31:01 1997 Sat Feb 15 17:32:01 1997 | @ 1 min | Sat Feb 15 17:33:01 1997 | Sat Feb 15 17:31:01 1997
Sat Feb 15 17:32:01 1997 | @ 5 hours | Sat Feb 15 22:32:01 1997 | Sat Feb 15 12:32:01 1997 Sat Feb 15 17:32:01 1997 | @ 5 hours | Sat Feb 15 22:32:01 1997 | Sat Feb 15 12:32:01 1997
Sun Feb 16 17:32:01 1997 | @ 1 min | Sun Feb 16 17:33:01 1997 | Sun Feb 16 17:31:01 1997 Sun Feb 16 17:32:01 1997 | @ 1 min | Sun Feb 16 17:33:01 1997 | Sun Feb 16 17:31:01 1997
Sun Feb 16 17:32:01 1997 | @ 1 min | Sun Feb 16 17:33:01 1997 | Sun Feb 16 17:31:01 1997 Sun Feb 16 17:32:01 1997 | @ 1 min | Sun Feb 16 17:33:01 1997 | Sun Feb 16 17:31:01 1997
Sun Feb 16 17:32:01 1997 | @ 5 hours | Sun Feb 16 22:32:01 1997 | Sun Feb 16 12:32:01 1997 Sun Feb 16 17:32:01 1997 | @ 5 hours | Sun Feb 16 22:32:01 1997 | Sun Feb 16 12:32:01 1997
Sun Feb 16 17:32:01 1997 | @ 5 hours | Sun Feb 16 22:32:01 1997 | Sun Feb 16 12:32:01 1997 Sun Feb 16 17:32:01 1997 | @ 5 hours | Sun Feb 16 22:32:01 1997 | Sun Feb 16 12:32:01 1997
Fri Feb 28 17:32:01 1997 | @ 1 min | Fri Feb 28 17:33:01 1997 | Fri Feb 28 17:31:01 1997 Fri Feb 28 17:32:01 1997 | @ 1 min | Fri Feb 28 17:33:01 1997 | Fri Feb 28 17:31:01 1997
Fri Feb 28 17:32:01 1997 | @ 5 hours | Fri Feb 28 22:32:01 1997 | Fri Feb 28 12:32:01 1997 Fri Feb 28 17:32:01 1997 | @ 5 hours | Fri Feb 28 22:32:01 1997 | Fri Feb 28 12:32:01 1997
Sat Mar 01 17:32:01 1997 | @ 1 min | Sat Mar 01 17:33:01 1997 | Sat Mar 01 17:31:01 1997 Sat Mar 01 17:32:01 1997 | @ 1 min | Sat Mar 01 17:33:01 1997 | Sat Mar 01 17:31:01 1997
Sat Mar 01 17:32:01 1997 | @ 5 hours | Sat Mar 01 22:32:01 1997 | Sat Mar 01 12:32:01 1997 Sat Mar 01 17:32:01 1997 | @ 5 hours | Sat Mar 01 22:32:01 1997 | Sat Mar 01 12:32:01 1997
Tue Jun 10 17:32:01 1997 | @ 1 min | Tue Jun 10 17:33:01 1997 | Tue Jun 10 17:31:01 1997 Tue Jun 10 17:32:01 1997 | @ 1 min | Tue Jun 10 17:33:01 1997 | Tue Jun 10 17:31:01 1997
Tue Jun 10 17:32:01 1997 | @ 5 hours | Tue Jun 10 22:32:01 1997 | Tue Jun 10 12:32:01 1997 Tue Jun 10 17:32:01 1997 | @ 5 hours | Tue Jun 10 22:32:01 1997 | Tue Jun 10 12:32:01 1997
Tue Jun 10 18:32:01 1997 | @ 1 min | Tue Jun 10 18:33:01 1997 | Tue Jun 10 18:31:01 1997 Tue Jun 10 18:32:01 1997 | @ 1 min | Tue Jun 10 18:33:01 1997 | Tue Jun 10 18:31:01 1997
Tue Jun 10 18:32:01 1997 | @ 5 hours | Tue Jun 10 23:32:01 1997 | Tue Jun 10 13:32:01 1997 Tue Jun 10 18:32:01 1997 | @ 5 hours | Tue Jun 10 23:32:01 1997 | Tue Jun 10 13:32:01 1997
Tue Dec 30 17:32:01 1997 | @ 1 min | Tue Dec 30 17:33:01 1997 | Tue Dec 30 17:31:01 1997 Tue Dec 30 17:32:01 1997 | @ 1 min | Tue Dec 30 17:33:01 1997 | Tue Dec 30 17:31:01 1997
Tue Dec 30 17:32:01 1997 | @ 5 hours | Tue Dec 30 22:32:01 1997 | Tue Dec 30 12:32:01 1997 Tue Dec 30 17:32:01 1997 | @ 5 hours | Tue Dec 30 22:32:01 1997 | Tue Dec 30 12:32:01 1997
Wed Dec 31 17:32:01 1997 | @ 1 min | Wed Dec 31 17:33:01 1997 | Wed Dec 31 17:31:01 1997 Wed Dec 31 17:32:01 1997 | @ 1 min | Wed Dec 31 17:33:01 1997 | Wed Dec 31 17:31:01 1997
Wed Dec 31 17:32:01 1997 | @ 5 hours | Wed Dec 31 22:32:01 1997 | Wed Dec 31 12:32:01 1997 Wed Dec 31 17:32:01 1997 | @ 5 hours | Wed Dec 31 22:32:01 1997 | Wed Dec 31 12:32:01 1997
Fri Dec 31 17:32:01 1999 | @ 1 min | Fri Dec 31 17:33:01 1999 | Fri Dec 31 17:31:01 1999 Fri Dec 31 17:32:01 1999 | @ 1 min | Fri Dec 31 17:33:01 1999 | Fri Dec 31 17:31:01 1999
Fri Dec 31 17:32:01 1999 | @ 5 hours | Fri Dec 31 22:32:01 1999 | Fri Dec 31 12:32:01 1999 Fri Dec 31 17:32:01 1999 | @ 5 hours | Fri Dec 31 22:32:01 1999 | Fri Dec 31 12:32:01 1999
Sat Jan 01 17:32:01 2000 | @ 1 min | Sat Jan 01 17:33:01 2000 | Sat Jan 01 17:31:01 2000 Sat Jan 01 17:32:01 2000 | @ 1 min | Sat Jan 01 17:33:01 2000 | Sat Jan 01 17:31:01 2000
Sat Jan 01 17:32:01 2000 | @ 5 hours | Sat Jan 01 22:32:01 2000 | Sat Jan 01 12:32:01 2000 Sat Jan 01 17:32:01 2000 | @ 5 hours | Sat Jan 01 22:32:01 2000 | Sat Jan 01 12:32:01 2000
Wed Mar 15 02:14:05 2000 | @ 1 min | Wed Mar 15 02:15:05 2000 | Wed Mar 15 02:13:05 2000 Wed Mar 15 02:14:05 2000 | @ 1 min | Wed Mar 15 02:15:05 2000 | Wed Mar 15 02:13:05 2000
Wed Mar 15 02:14:05 2000 | @ 5 hours | Wed Mar 15 07:14:05 2000 | Tue Mar 14 21:14:05 2000 Wed Mar 15 02:14:05 2000 | @ 5 hours | Wed Mar 15 07:14:05 2000 | Tue Mar 14 21:14:05 2000
Wed Mar 15 03:14:04 2000 | @ 1 min | Wed Mar 15 03:15:04 2000 | Wed Mar 15 03:13:04 2000 Wed Mar 15 03:14:04 2000 | @ 1 min | Wed Mar 15 03:15:04 2000 | Wed Mar 15 03:13:04 2000
Wed Mar 15 03:14:04 2000 | @ 5 hours | Wed Mar 15 08:14:04 2000 | Tue Mar 14 22:14:04 2000 Wed Mar 15 03:14:04 2000 | @ 5 hours | Wed Mar 15 08:14:04 2000 | Tue Mar 14 22:14:04 2000
Wed Mar 15 08:14:01 2000 | @ 1 min | Wed Mar 15 08:15:01 2000 | Wed Mar 15 08:13:01 2000 Wed Mar 15 08:14:01 2000 | @ 1 min | Wed Mar 15 08:15:01 2000 | Wed Mar 15 08:13:01 2000
Wed Mar 15 08:14:01 2000 | @ 5 hours | Wed Mar 15 13:14:01 2000 | Wed Mar 15 03:14:01 2000 Wed Mar 15 08:14:01 2000 | @ 5 hours | Wed Mar 15 13:14:01 2000 | Wed Mar 15 03:14:01 2000
Wed Mar 15 12:14:03 2000 | @ 1 min | Wed Mar 15 12:15:03 2000 | Wed Mar 15 12:13:03 2000 Wed Mar 15 12:14:03 2000 | @ 1 min | Wed Mar 15 12:15:03 2000 | Wed Mar 15 12:13:03 2000
Wed Mar 15 12:14:03 2000 | @ 5 hours | Wed Mar 15 17:14:03 2000 | Wed Mar 15 07:14:03 2000 Wed Mar 15 12:14:03 2000 | @ 5 hours | Wed Mar 15 17:14:03 2000 | Wed Mar 15 07:14:03 2000
Wed Mar 15 13:14:02 2000 | @ 1 min | Wed Mar 15 13:15:02 2000 | Wed Mar 15 13:13:02 2000 Wed Mar 15 13:14:02 2000 | @ 1 min | Wed Mar 15 13:15:02 2000 | Wed Mar 15 13:13:02 2000
Wed Mar 15 13:14:02 2000 | @ 5 hours | Wed Mar 15 18:14:02 2000 | Wed Mar 15 08:14:02 2000 Wed Mar 15 13:14:02 2000 | @ 5 hours | Wed Mar 15 18:14:02 2000 | Wed Mar 15 08:14:02 2000
Sun Dec 31 17:32:01 2000 | @ 1 min | Sun Dec 31 17:33:01 2000 | Sun Dec 31 17:31:01 2000 Sun Dec 31 17:32:01 2000 | @ 1 min | Sun Dec 31 17:33:01 2000 | Sun Dec 31 17:31:01 2000
Sun Dec 31 17:32:01 2000 | @ 5 hours | Sun Dec 31 22:32:01 2000 | Sun Dec 31 12:32:01 2000 Sun Dec 31 17:32:01 2000 | @ 5 hours | Sun Dec 31 22:32:01 2000 | Sun Dec 31 12:32:01 2000
(104 rows) (104 rows)
SELECT t.f1 AS t, i.f1 AS i, t.f1 + i.f1 AS "add", t.f1 - i.f1 AS "subtract" SELECT t.f1 AS t, i.f1 AS i, t.f1 + i.f1 AS "add", t.f1 - i.f1 AS "subtract"
...@@ -2182,9 +2182,9 @@ SELECT '' AS "64", d1 AS us_postgres FROM TIMESTAMP_TBL; ...@@ -2182,9 +2182,9 @@ SELECT '' AS "64", d1 AS us_postgres FROM TIMESTAMP_TBL;
| Mon Feb 10 17:32:01 1997 | Mon Feb 10 17:32:01 1997
| Mon Feb 10 17:32:01 1997 | Mon Feb 10 17:32:01 1997
| Mon Feb 10 17:32:02 1997 | Mon Feb 10 17:32:02 1997
| Mon Feb 10 17:32:01.40 1997 | Mon Feb 10 17:32:01.4 1997
| Mon Feb 10 17:32:01.50 1997 | Mon Feb 10 17:32:01.5 1997
| Mon Feb 10 17:32:01.60 1997 | Mon Feb 10 17:32:01.6 1997
| Thu Jan 02 00:00:00 1997 | Thu Jan 02 00:00:00 1997
| Thu Jan 02 03:04:05 1997 | Thu Jan 02 03:04:05 1997
| Mon Feb 10 17:32:01 1997 | Mon Feb 10 17:32:01 1997
...@@ -2265,9 +2265,9 @@ SELECT '' AS "64", d1 AS us_iso FROM TIMESTAMP_TBL; ...@@ -2265,9 +2265,9 @@ SELECT '' AS "64", d1 AS us_iso FROM TIMESTAMP_TBL;
| 1997-02-10 17:32:01 | 1997-02-10 17:32:01
| 1997-02-10 17:32:01 | 1997-02-10 17:32:01
| 1997-02-10 17:32:02 | 1997-02-10 17:32:02
| 1997-02-10 17:32:01.40 | 1997-02-10 17:32:01.4
| 1997-02-10 17:32:01.50 | 1997-02-10 17:32:01.5
| 1997-02-10 17:32:01.60 | 1997-02-10 17:32:01.6
| 1997-01-02 00:00:00 | 1997-01-02 00:00:00
| 1997-01-02 03:04:05 | 1997-01-02 03:04:05
| 1997-02-10 17:32:01 | 1997-02-10 17:32:01
...@@ -2354,9 +2354,9 @@ SELECT '' AS "64", d1 AS us_sql FROM TIMESTAMP_TBL; ...@@ -2354,9 +2354,9 @@ SELECT '' AS "64", d1 AS us_sql FROM TIMESTAMP_TBL;
| 02/10/1997 17:32:01 | 02/10/1997 17:32:01
| 02/10/1997 17:32:01 | 02/10/1997 17:32:01
| 02/10/1997 17:32:02 | 02/10/1997 17:32:02
| 02/10/1997 17:32:01.40 | 02/10/1997 17:32:01.4
| 02/10/1997 17:32:01.50 | 02/10/1997 17:32:01.5
| 02/10/1997 17:32:01.60 | 02/10/1997 17:32:01.6
| 01/02/1997 00:00:00 | 01/02/1997 00:00:00
| 01/02/1997 03:04:05 | 01/02/1997 03:04:05
| 02/10/1997 17:32:01 | 02/10/1997 17:32:01
...@@ -2450,9 +2450,9 @@ SELECT '' AS "65", d1 AS european_postgres FROM TIMESTAMP_TBL; ...@@ -2450,9 +2450,9 @@ SELECT '' AS "65", d1 AS european_postgres FROM TIMESTAMP_TBL;
| Mon 10 Feb 17:32:01 1997 | Mon 10 Feb 17:32:01 1997
| Mon 10 Feb 17:32:01 1997 | Mon 10 Feb 17:32:01 1997
| Mon 10 Feb 17:32:02 1997 | Mon 10 Feb 17:32:02 1997
| Mon 10 Feb 17:32:01.40 1997 | Mon 10 Feb 17:32:01.4 1997
| Mon 10 Feb 17:32:01.50 1997 | Mon 10 Feb 17:32:01.5 1997
| Mon 10 Feb 17:32:01.60 1997 | Mon 10 Feb 17:32:01.6 1997
| Thu 02 Jan 00:00:00 1997 | Thu 02 Jan 00:00:00 1997
| Thu 02 Jan 03:04:05 1997 | Thu 02 Jan 03:04:05 1997
| Mon 10 Feb 17:32:01 1997 | Mon 10 Feb 17:32:01 1997
...@@ -2540,9 +2540,9 @@ SELECT '' AS "65", d1 AS european_iso FROM TIMESTAMP_TBL; ...@@ -2540,9 +2540,9 @@ SELECT '' AS "65", d1 AS european_iso FROM TIMESTAMP_TBL;
| 1997-02-10 17:32:01 | 1997-02-10 17:32:01
| 1997-02-10 17:32:01 | 1997-02-10 17:32:01
| 1997-02-10 17:32:02 | 1997-02-10 17:32:02
| 1997-02-10 17:32:01.40 | 1997-02-10 17:32:01.4
| 1997-02-10 17:32:01.50 | 1997-02-10 17:32:01.5
| 1997-02-10 17:32:01.60 | 1997-02-10 17:32:01.6
| 1997-01-02 00:00:00 | 1997-01-02 00:00:00
| 1997-01-02 03:04:05 | 1997-01-02 03:04:05
| 1997-02-10 17:32:01 | 1997-02-10 17:32:01
...@@ -2630,9 +2630,9 @@ SELECT '' AS "65", d1 AS european_sql FROM TIMESTAMP_TBL; ...@@ -2630,9 +2630,9 @@ SELECT '' AS "65", d1 AS european_sql FROM TIMESTAMP_TBL;
| 10/02/1997 17:32:01 | 10/02/1997 17:32:01
| 10/02/1997 17:32:01 | 10/02/1997 17:32:01
| 10/02/1997 17:32:02 | 10/02/1997 17:32:02
| 10/02/1997 17:32:01.40 | 10/02/1997 17:32:01.4
| 10/02/1997 17:32:01.50 | 10/02/1997 17:32:01.5
| 10/02/1997 17:32:01.60 | 10/02/1997 17:32:01.6
| 02/01/1997 00:00:00 | 02/01/1997 00:00:00
| 02/01/1997 03:04:05 | 02/01/1997 03:04:05
| 10/02/1997 17:32:01 | 10/02/1997 17:32:01
......
...@@ -223,7 +223,7 @@ FROM INTERVAL_MULDIV_TBL; ...@@ -223,7 +223,7 @@ FROM INTERVAL_MULDIV_TBL;
1 year 12 days 122:24:00 1 year 12 days 122:24:00
-1 years -12 days +93:36:00 -1 years -12 days +93:36:00
-3 days -14:24:00 -3 days -14:24:00
2 mons 13 days 01:22:28.80 2 mons 13 days 01:22:28.8
-10 mons +120 days 37:28:21.6567 -10 mons +120 days 37:28:21.6567
1 mon 6 days 1 mon 6 days
4 mons 6 days 4 mons 6 days
...@@ -237,7 +237,7 @@ FROM INTERVAL_MULDIV_TBL; ...@@ -237,7 +237,7 @@ FROM INTERVAL_MULDIV_TBL;
28 years 104 days 2961:36:00 28 years 104 days 2961:36:00
-28 years -104 days +2942:24:00 -28 years -104 days +2942:24:00
-98 days -09:36:00 -98 days -09:36:00
6 years 1 mon -197 days +93:34:27.20 6 years 1 mon -197 days +93:34:27.2
-24 years -7 mons +3946 days 640:15:11.9498 -24 years -7 mons +3946 days 640:15:11.9498
2 years 8 mons 24 days 2 years 8 mons 24 days
9 years 6 mons 24 days 9 years 6 mons 24 days
...@@ -251,7 +251,7 @@ FROM INTERVAL_MULDIV_TBL; ...@@ -251,7 +251,7 @@ FROM INTERVAL_MULDIV_TBL;
4 mons 4 days 40:48:00 4 mons 4 days 40:48:00
-4 mons -4 days +31:12:00 -4 mons -4 days +31:12:00
-1 days -04:48:00 -1 days -04:48:00
25 days -15:32:30.40 25 days -15:32:30.4
-3 mons +30 days 12:29:27.2189 -3 mons +30 days 12:29:27.2189
12 days 12 days
1 mon 12 days 1 mon 12 days
...@@ -655,9 +655,9 @@ select interval '0' AS "zero", ...@@ -655,9 +655,9 @@ select interval '0' AS "zero",
(interval '1-2' + interval '3 4:05:06.7') AS "all fields", (interval '1-2' + interval '3 4:05:06.7') AS "all fields",
(interval '1-2' - interval '3 4:05:06.7') AS "mixed sign", (interval '1-2' - interval '3 4:05:06.7') AS "mixed sign",
(- interval '1-2' + interval '3 4:05:06.7') AS "negative"; (- interval '1-2' + interval '3 4:05:06.7') AS "negative";
zero | a year 2 months | a bit over a day | a bit over 2 hours | all fields | mixed sign | negative zero | a year 2 months | a bit over a day | a bit over 2 hours | all fields | mixed sign | negative
------+-----------------+------------------+--------------------+-------------------+-----------------------+--------------------- ------+-----------------+------------------+--------------------+------------------+----------------------+--------------------
PT0S | P1Y2M | P1DT2H3M4S | PT2H3M4.45679S | P1Y2M3DT4H5M6.70S | P1Y2M-3DT-4H-5M-6.70S | P-1Y-2M3DT4H5M6.70S PT0S | P1Y2M | P1DT2H3M4S | PT2H3M4.45679S | P1Y2M3DT4H5M6.7S | P1Y2M-3DT-4H-5M-6.7S | P-1Y-2M3DT4H5M6.7S
(1 row) (1 row)
-- test inputting ISO 8601 4.4.2.1 "Format With Time Unit Designators" -- test inputting ISO 8601 4.4.2.1 "Format With Time Unit Designators"
...@@ -669,9 +669,9 @@ select interval 'P0Y' AS "zero", ...@@ -669,9 +669,9 @@ select interval 'P0Y' AS "zero",
interval 'P1Y2M3DT4H5M6.7S' AS "all fields", interval 'P1Y2M3DT4H5M6.7S' AS "all fields",
interval 'P-1Y-2M-3DT-4H-5M-6.7S' AS "negative", interval 'P-1Y-2M-3DT-4H-5M-6.7S' AS "negative",
interval 'PT-0.1S' AS "fractional second"; interval 'PT-0.1S' AS "fractional second";
zero | a year 2 months | a week | a bit over a day | all fields | negative | fractional second zero | a year 2 months | a week | a bit over a day | all fields | negative | fractional second
------+-----------------+-----------+------------------+---------------------+---------------------+------------------- ------+-----------------+-----------+------------------+--------------------+--------------------+-------------------
0 | 1-2 | 7 0:00:00 | 1 2:03:04 | +1-2 +3 +4:05:06.70 | -1-2 -3 -4:05:06.70 | -0:00:00.10 0 | 1-2 | 7 0:00:00 | 1 2:03:04 | +1-2 +3 +4:05:06.7 | -1-2 -3 -4:05:06.7 | -0:00:00.1
(1 row) (1 row)
-- test inputting ISO 8601 4.4.2.2 "Alternative Format" -- test inputting ISO 8601 4.4.2.2 "Alternative Format"
...@@ -697,3 +697,23 @@ select interval 'P0002' AS "year only", ...@@ -697,3 +697,23 @@ select interval 'P0002' AS "year only",
2 years | 2 years 10 mons | 2 years 10 mons 15 days | 2 years 00:00:01 | 2 years 10 mons 00:00:01 | 2 years 10 mons 15 days 00:00:01 | 10:00:00 | 10:30:00 2 years | 2 years 10 mons | 2 years 10 mons 15 days | 2 years 00:00:01 | 2 years 10 mons 00:00:01 | 2 years 10 mons 15 days 00:00:01 | 10:00:00 | 10:30:00
(1 row) (1 row)
-- test a couple rounding cases that changed since 8.3 w/ HAVE_INT64_TIMESTAMP.
SET IntervalStyle to postgres_verbose;
select interval '-10 mons -3 days +03:55:06.70';
interval
--------------------------------------------------
@ 10 mons 3 days -3 hours -55 mins -6.7 secs ago
(1 row)
select interval '1 year 2 mons 3 days 04:05:06.699999';
interval
-----------------------------------------------------
@ 1 year 2 mons 3 days 4 hours 5 mins 6.699999 secs
(1 row)
select interval '0:0:0.7', interval '@ 0.70 secs', interval '0.7 seconds';
interval | interval | interval
------------+------------+------------
@ 0.7 secs | @ 0.7 secs | @ 0.7 secs
(1 row)
...@@ -193,9 +193,9 @@ SELECT '' AS "64", d1 FROM TIMESTAMP_TBL; ...@@ -193,9 +193,9 @@ SELECT '' AS "64", d1 FROM TIMESTAMP_TBL;
| Mon Feb 10 17:32:01 1997 | Mon Feb 10 17:32:01 1997
| Mon Feb 10 17:32:01 1997 | Mon Feb 10 17:32:01 1997
| Mon Feb 10 17:32:02 1997 | Mon Feb 10 17:32:02 1997
| Mon Feb 10 17:32:01.40 1997 | Mon Feb 10 17:32:01.4 1997
| Mon Feb 10 17:32:01.50 1997 | Mon Feb 10 17:32:01.5 1997
| Mon Feb 10 17:32:01.60 1997 | Mon Feb 10 17:32:01.6 1997
| Thu Jan 02 00:00:00 1997 | Thu Jan 02 00:00:00 1997
| Thu Jan 02 03:04:05 1997 | Thu Jan 02 03:04:05 1997
| Mon Feb 10 17:32:01 1997 | Mon Feb 10 17:32:01 1997
...@@ -257,15 +257,15 @@ SELECT '' AS "64", d1 FROM TIMESTAMP_TBL; ...@@ -257,15 +257,15 @@ SELECT '' AS "64", d1 FROM TIMESTAMP_TBL;
-- Demonstrate functions and operators -- Demonstrate functions and operators
SELECT '' AS "48", d1 FROM TIMESTAMP_TBL SELECT '' AS "48", d1 FROM TIMESTAMP_TBL
WHERE d1 > timestamp without time zone '1997-01-02'; WHERE d1 > timestamp without time zone '1997-01-02';
48 | d1 48 | d1
----+----------------------------- ----+----------------------------
| infinity | infinity
| Mon Feb 10 17:32:01 1997 | Mon Feb 10 17:32:01 1997
| Mon Feb 10 17:32:01 1997 | Mon Feb 10 17:32:01 1997
| Mon Feb 10 17:32:02 1997 | Mon Feb 10 17:32:02 1997
| Mon Feb 10 17:32:01.40 1997 | Mon Feb 10 17:32:01.4 1997
| Mon Feb 10 17:32:01.50 1997 | Mon Feb 10 17:32:01.5 1997
| Mon Feb 10 17:32:01.60 1997 | Mon Feb 10 17:32:01.6 1997
| Thu Jan 02 03:04:05 1997 | Thu Jan 02 03:04:05 1997
| Mon Feb 10 17:32:01 1997 | Mon Feb 10 17:32:01 1997
| Mon Feb 10 17:32:01 1997 | Mon Feb 10 17:32:01 1997
...@@ -348,9 +348,9 @@ SELECT '' AS "63", d1 FROM TIMESTAMP_TBL ...@@ -348,9 +348,9 @@ SELECT '' AS "63", d1 FROM TIMESTAMP_TBL
| Mon Feb 10 17:32:01 1997 | Mon Feb 10 17:32:01 1997
| Mon Feb 10 17:32:01 1997 | Mon Feb 10 17:32:01 1997
| Mon Feb 10 17:32:02 1997 | Mon Feb 10 17:32:02 1997
| Mon Feb 10 17:32:01.40 1997 | Mon Feb 10 17:32:01.4 1997
| Mon Feb 10 17:32:01.50 1997 | Mon Feb 10 17:32:01.5 1997
| Mon Feb 10 17:32:01.60 1997 | Mon Feb 10 17:32:01.6 1997
| Thu Jan 02 03:04:05 1997 | Thu Jan 02 03:04:05 1997
| Mon Feb 10 17:32:01 1997 | Mon Feb 10 17:32:01 1997
| Mon Feb 10 17:32:01 1997 | Mon Feb 10 17:32:01 1997
...@@ -432,15 +432,15 @@ SELECT '' AS "16", d1 FROM TIMESTAMP_TBL ...@@ -432,15 +432,15 @@ SELECT '' AS "16", d1 FROM TIMESTAMP_TBL
SELECT '' AS "49", d1 FROM TIMESTAMP_TBL SELECT '' AS "49", d1 FROM TIMESTAMP_TBL
WHERE d1 >= timestamp without time zone '1997-01-02'; WHERE d1 >= timestamp without time zone '1997-01-02';
49 | d1 49 | d1
----+----------------------------- ----+----------------------------
| infinity | infinity
| Mon Feb 10 17:32:01 1997 | Mon Feb 10 17:32:01 1997
| Mon Feb 10 17:32:01 1997 | Mon Feb 10 17:32:01 1997
| Mon Feb 10 17:32:02 1997 | Mon Feb 10 17:32:02 1997
| Mon Feb 10 17:32:01.40 1997 | Mon Feb 10 17:32:01.4 1997
| Mon Feb 10 17:32:01.50 1997 | Mon Feb 10 17:32:01.5 1997
| Mon Feb 10 17:32:01.60 1997 | Mon Feb 10 17:32:01.6 1997
| Thu Jan 02 00:00:00 1997 | Thu Jan 02 00:00:00 1997
| Thu Jan 02 03:04:05 1997 | Thu Jan 02 03:04:05 1997
| Mon Feb 10 17:32:01 1997 | Mon Feb 10 17:32:01 1997
...@@ -494,9 +494,9 @@ SELECT '' AS "54", d1 - timestamp without time zone '1997-01-02' AS diff ...@@ -494,9 +494,9 @@ SELECT '' AS "54", d1 - timestamp without time zone '1997-01-02' AS diff
| @ 39 days 17 hours 32 mins 1 sec | @ 39 days 17 hours 32 mins 1 sec
| @ 39 days 17 hours 32 mins 1 sec | @ 39 days 17 hours 32 mins 1 sec
| @ 39 days 17 hours 32 mins 2 secs | @ 39 days 17 hours 32 mins 2 secs
| @ 39 days 17 hours 32 mins 1.40 secs | @ 39 days 17 hours 32 mins 1.4 secs
| @ 39 days 17 hours 32 mins 1.50 secs | @ 39 days 17 hours 32 mins 1.5 secs
| @ 39 days 17 hours 32 mins 1.60 secs | @ 39 days 17 hours 32 mins 1.6 secs
| @ 0 | @ 0
| @ 3 hours 4 mins 5 secs | @ 3 hours 4 mins 5 secs
| @ 39 days 17 hours 32 mins 1 sec | @ 39 days 17 hours 32 mins 1 sec
...@@ -564,9 +564,9 @@ SELECT '' AS "54", d1 - timestamp without time zone '1997-01-02' AS diff ...@@ -564,9 +564,9 @@ SELECT '' AS "54", d1 - timestamp without time zone '1997-01-02' AS diff
| @ 39 days 17 hours 32 mins 1 sec | @ 39 days 17 hours 32 mins 1 sec
| @ 39 days 17 hours 32 mins 1 sec | @ 39 days 17 hours 32 mins 1 sec
| @ 39 days 17 hours 32 mins 2 secs | @ 39 days 17 hours 32 mins 2 secs
| @ 39 days 17 hours 32 mins 1.40 secs | @ 39 days 17 hours 32 mins 1.4 secs
| @ 39 days 17 hours 32 mins 1.50 secs | @ 39 days 17 hours 32 mins 1.5 secs
| @ 39 days 17 hours 32 mins 1.60 secs | @ 39 days 17 hours 32 mins 1.6 secs
| @ 0 | @ 0
| @ 3 hours 4 mins 5 secs | @ 3 hours 4 mins 5 secs
| @ 39 days 17 hours 32 mins 1 sec | @ 39 days 17 hours 32 mins 1 sec
...@@ -622,189 +622,189 @@ SELECT '' AS "54", d1 as "timestamp", ...@@ -622,189 +622,189 @@ SELECT '' AS "54", d1 as "timestamp",
date_part( 'day', d1) AS day, date_part( 'hour', d1) AS hour, date_part( 'day', d1) AS day, date_part( 'hour', d1) AS hour,
date_part( 'minute', d1) AS minute, date_part( 'second', d1) AS second date_part( 'minute', d1) AS minute, date_part( 'second', d1) AS second
FROM TIMESTAMP_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01'; FROM TIMESTAMP_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01';
54 | timestamp | year | month | day | hour | minute | second 54 | timestamp | year | month | day | hour | minute | second
----+-----------------------------+------+-------+-----+------+--------+-------- ----+----------------------------+------+-------+-----+------+--------+--------
| Thu Jan 01 00:00:00 1970 | 1970 | 1 | 1 | 0 | 0 | 0 | Thu Jan 01 00:00:00 1970 | 1970 | 1 | 1 | 0 | 0 | 0
| Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:02 1997 | 1997 | 2 | 10 | 17 | 32 | 2 | Mon Feb 10 17:32:02 1997 | 1997 | 2 | 10 | 17 | 32 | 2
| Mon Feb 10 17:32:01.40 1997 | 1997 | 2 | 10 | 17 | 32 | 1.4 | Mon Feb 10 17:32:01.4 1997 | 1997 | 2 | 10 | 17 | 32 | 1.4
| Mon Feb 10 17:32:01.50 1997 | 1997 | 2 | 10 | 17 | 32 | 1.5 | Mon Feb 10 17:32:01.5 1997 | 1997 | 2 | 10 | 17 | 32 | 1.5
| Mon Feb 10 17:32:01.60 1997 | 1997 | 2 | 10 | 17 | 32 | 1.6 | Mon Feb 10 17:32:01.6 1997 | 1997 | 2 | 10 | 17 | 32 | 1.6
| Thu Jan 02 00:00:00 1997 | 1997 | 1 | 2 | 0 | 0 | 0 | Thu Jan 02 00:00:00 1997 | 1997 | 1 | 2 | 0 | 0 | 0
| Thu Jan 02 03:04:05 1997 | 1997 | 1 | 2 | 3 | 4 | 5 | Thu Jan 02 03:04:05 1997 | 1997 | 1 | 2 | 3 | 4 | 5
| Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1
| Tue Jun 10 17:32:01 1997 | 1997 | 6 | 10 | 17 | 32 | 1 | Tue Jun 10 17:32:01 1997 | 1997 | 6 | 10 | 17 | 32 | 1
| Sat Sep 22 18:19:20 2001 | 2001 | 9 | 22 | 18 | 19 | 20 | Sat Sep 22 18:19:20 2001 | 2001 | 9 | 22 | 18 | 19 | 20
| Wed Mar 15 08:14:01 2000 | 2000 | 3 | 15 | 8 | 14 | 1 | Wed Mar 15 08:14:01 2000 | 2000 | 3 | 15 | 8 | 14 | 1
| Wed Mar 15 13:14:02 2000 | 2000 | 3 | 15 | 13 | 14 | 2 | Wed Mar 15 13:14:02 2000 | 2000 | 3 | 15 | 13 | 14 | 2
| Wed Mar 15 12:14:03 2000 | 2000 | 3 | 15 | 12 | 14 | 3 | Wed Mar 15 12:14:03 2000 | 2000 | 3 | 15 | 12 | 14 | 3
| Wed Mar 15 03:14:04 2000 | 2000 | 3 | 15 | 3 | 14 | 4 | Wed Mar 15 03:14:04 2000 | 2000 | 3 | 15 | 3 | 14 | 4
| Wed Mar 15 02:14:05 2000 | 2000 | 3 | 15 | 2 | 14 | 5 | Wed Mar 15 02:14:05 2000 | 2000 | 3 | 15 | 2 | 14 | 5
| Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:00 1997 | 1997 | 2 | 10 | 17 | 32 | 0 | Mon Feb 10 17:32:00 1997 | 1997 | 2 | 10 | 17 | 32 | 0
| Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1
| Tue Jun 10 18:32:01 1997 | 1997 | 6 | 10 | 18 | 32 | 1 | Tue Jun 10 18:32:01 1997 | 1997 | 6 | 10 | 18 | 32 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 2 | 10 | 17 | 32 | 1
| Tue Feb 11 17:32:01 1997 | 1997 | 2 | 11 | 17 | 32 | 1 | Tue Feb 11 17:32:01 1997 | 1997 | 2 | 11 | 17 | 32 | 1
| Wed Feb 12 17:32:01 1997 | 1997 | 2 | 12 | 17 | 32 | 1 | Wed Feb 12 17:32:01 1997 | 1997 | 2 | 12 | 17 | 32 | 1
| Thu Feb 13 17:32:01 1997 | 1997 | 2 | 13 | 17 | 32 | 1 | Thu Feb 13 17:32:01 1997 | 1997 | 2 | 13 | 17 | 32 | 1
| Fri Feb 14 17:32:01 1997 | 1997 | 2 | 14 | 17 | 32 | 1 | Fri Feb 14 17:32:01 1997 | 1997 | 2 | 14 | 17 | 32 | 1
| Sat Feb 15 17:32:01 1997 | 1997 | 2 | 15 | 17 | 32 | 1 | Sat Feb 15 17:32:01 1997 | 1997 | 2 | 15 | 17 | 32 | 1
| Sun Feb 16 17:32:01 1997 | 1997 | 2 | 16 | 17 | 32 | 1 | Sun Feb 16 17:32:01 1997 | 1997 | 2 | 16 | 17 | 32 | 1
| Sun Feb 16 17:32:01 1997 | 1997 | 2 | 16 | 17 | 32 | 1 | Sun Feb 16 17:32:01 1997 | 1997 | 2 | 16 | 17 | 32 | 1
| Wed Feb 28 17:32:01 1996 | 1996 | 2 | 28 | 17 | 32 | 1 | Wed Feb 28 17:32:01 1996 | 1996 | 2 | 28 | 17 | 32 | 1
| Thu Feb 29 17:32:01 1996 | 1996 | 2 | 29 | 17 | 32 | 1 | Thu Feb 29 17:32:01 1996 | 1996 | 2 | 29 | 17 | 32 | 1
| Fri Mar 01 17:32:01 1996 | 1996 | 3 | 1 | 17 | 32 | 1 | Fri Mar 01 17:32:01 1996 | 1996 | 3 | 1 | 17 | 32 | 1
| Mon Dec 30 17:32:01 1996 | 1996 | 12 | 30 | 17 | 32 | 1 | Mon Dec 30 17:32:01 1996 | 1996 | 12 | 30 | 17 | 32 | 1
| Tue Dec 31 17:32:01 1996 | 1996 | 12 | 31 | 17 | 32 | 1 | Tue Dec 31 17:32:01 1996 | 1996 | 12 | 31 | 17 | 32 | 1
| Wed Jan 01 17:32:01 1997 | 1997 | 1 | 1 | 17 | 32 | 1 | Wed Jan 01 17:32:01 1997 | 1997 | 1 | 1 | 17 | 32 | 1
| Fri Feb 28 17:32:01 1997 | 1997 | 2 | 28 | 17 | 32 | 1 | Fri Feb 28 17:32:01 1997 | 1997 | 2 | 28 | 17 | 32 | 1
| Sat Mar 01 17:32:01 1997 | 1997 | 3 | 1 | 17 | 32 | 1 | Sat Mar 01 17:32:01 1997 | 1997 | 3 | 1 | 17 | 32 | 1
| Tue Dec 30 17:32:01 1997 | 1997 | 12 | 30 | 17 | 32 | 1 | Tue Dec 30 17:32:01 1997 | 1997 | 12 | 30 | 17 | 32 | 1
| Wed Dec 31 17:32:01 1997 | 1997 | 12 | 31 | 17 | 32 | 1 | Wed Dec 31 17:32:01 1997 | 1997 | 12 | 31 | 17 | 32 | 1
| Fri Dec 31 17:32:01 1999 | 1999 | 12 | 31 | 17 | 32 | 1 | Fri Dec 31 17:32:01 1999 | 1999 | 12 | 31 | 17 | 32 | 1
| Sat Jan 01 17:32:01 2000 | 2000 | 1 | 1 | 17 | 32 | 1 | Sat Jan 01 17:32:01 2000 | 2000 | 1 | 1 | 17 | 32 | 1
| Sun Dec 31 17:32:01 2000 | 2000 | 12 | 31 | 17 | 32 | 1 | Sun Dec 31 17:32:01 2000 | 2000 | 12 | 31 | 17 | 32 | 1
| Mon Jan 01 17:32:01 2001 | 2001 | 1 | 1 | 17 | 32 | 1 | Mon Jan 01 17:32:01 2001 | 2001 | 1 | 1 | 17 | 32 | 1
(55 rows) (55 rows)
SELECT '' AS "54", d1 as "timestamp", SELECT '' AS "54", d1 as "timestamp",
date_part( 'quarter', d1) AS quarter, date_part( 'msec', d1) AS msec, date_part( 'quarter', d1) AS quarter, date_part( 'msec', d1) AS msec,
date_part( 'usec', d1) AS usec date_part( 'usec', d1) AS usec
FROM TIMESTAMP_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01'; FROM TIMESTAMP_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01';
54 | timestamp | quarter | msec | usec 54 | timestamp | quarter | msec | usec
----+-----------------------------+---------+-------+---------- ----+----------------------------+---------+-------+----------
| Thu Jan 01 00:00:00 1970 | 1 | 0 | 0 | Thu Jan 01 00:00:00 1970 | 1 | 0 | 0
| Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000
| Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000
| Mon Feb 10 17:32:02 1997 | 1 | 2000 | 2000000 | Mon Feb 10 17:32:02 1997 | 1 | 2000 | 2000000
| Mon Feb 10 17:32:01.40 1997 | 1 | 1400 | 1400000 | Mon Feb 10 17:32:01.4 1997 | 1 | 1400 | 1400000
| Mon Feb 10 17:32:01.50 1997 | 1 | 1500 | 1500000 | Mon Feb 10 17:32:01.5 1997 | 1 | 1500 | 1500000
| Mon Feb 10 17:32:01.60 1997 | 1 | 1600 | 1600000 | Mon Feb 10 17:32:01.6 1997 | 1 | 1600 | 1600000
| Thu Jan 02 00:00:00 1997 | 1 | 0 | 0 | Thu Jan 02 00:00:00 1997 | 1 | 0 | 0
| Thu Jan 02 03:04:05 1997 | 1 | 5000 | 5000000 | Thu Jan 02 03:04:05 1997 | 1 | 5000 | 5000000
| Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000
| Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000
| Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000
| Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000
| Tue Jun 10 17:32:01 1997 | 2 | 1000 | 1000000 | Tue Jun 10 17:32:01 1997 | 2 | 1000 | 1000000
| Sat Sep 22 18:19:20 2001 | 3 | 20000 | 20000000 | Sat Sep 22 18:19:20 2001 | 3 | 20000 | 20000000
| Wed Mar 15 08:14:01 2000 | 1 | 1000 | 1000000 | Wed Mar 15 08:14:01 2000 | 1 | 1000 | 1000000
| Wed Mar 15 13:14:02 2000 | 1 | 2000 | 2000000 | Wed Mar 15 13:14:02 2000 | 1 | 2000 | 2000000
| Wed Mar 15 12:14:03 2000 | 1 | 3000 | 3000000 | Wed Mar 15 12:14:03 2000 | 1 | 3000 | 3000000
| Wed Mar 15 03:14:04 2000 | 1 | 4000 | 4000000 | Wed Mar 15 03:14:04 2000 | 1 | 4000 | 4000000
| Wed Mar 15 02:14:05 2000 | 1 | 5000 | 5000000 | Wed Mar 15 02:14:05 2000 | 1 | 5000 | 5000000
| Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000
| Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000
| Mon Feb 10 17:32:00 1997 | 1 | 0 | 0 | Mon Feb 10 17:32:00 1997 | 1 | 0 | 0
| Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000
| Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000
| Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000
| Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000
| Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000
| Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000
| Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000
| Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000
| Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000
| Tue Jun 10 18:32:01 1997 | 2 | 1000 | 1000000 | Tue Jun 10 18:32:01 1997 | 2 | 1000 | 1000000
| Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 | 1 | 1000 | 1000000
| Tue Feb 11 17:32:01 1997 | 1 | 1000 | 1000000 | Tue Feb 11 17:32:01 1997 | 1 | 1000 | 1000000
| Wed Feb 12 17:32:01 1997 | 1 | 1000 | 1000000 | Wed Feb 12 17:32:01 1997 | 1 | 1000 | 1000000
| Thu Feb 13 17:32:01 1997 | 1 | 1000 | 1000000 | Thu Feb 13 17:32:01 1997 | 1 | 1000 | 1000000
| Fri Feb 14 17:32:01 1997 | 1 | 1000 | 1000000 | Fri Feb 14 17:32:01 1997 | 1 | 1000 | 1000000
| Sat Feb 15 17:32:01 1997 | 1 | 1000 | 1000000 | Sat Feb 15 17:32:01 1997 | 1 | 1000 | 1000000
| Sun Feb 16 17:32:01 1997 | 1 | 1000 | 1000000 | Sun Feb 16 17:32:01 1997 | 1 | 1000 | 1000000
| Sun Feb 16 17:32:01 1997 | 1 | 1000 | 1000000 | Sun Feb 16 17:32:01 1997 | 1 | 1000 | 1000000
| Wed Feb 28 17:32:01 1996 | 1 | 1000 | 1000000 | Wed Feb 28 17:32:01 1996 | 1 | 1000 | 1000000
| Thu Feb 29 17:32:01 1996 | 1 | 1000 | 1000000 | Thu Feb 29 17:32:01 1996 | 1 | 1000 | 1000000
| Fri Mar 01 17:32:01 1996 | 1 | 1000 | 1000000 | Fri Mar 01 17:32:01 1996 | 1 | 1000 | 1000000
| Mon Dec 30 17:32:01 1996 | 4 | 1000 | 1000000 | Mon Dec 30 17:32:01 1996 | 4 | 1000 | 1000000
| Tue Dec 31 17:32:01 1996 | 4 | 1000 | 1000000 | Tue Dec 31 17:32:01 1996 | 4 | 1000 | 1000000
| Wed Jan 01 17:32:01 1997 | 1 | 1000 | 1000000 | Wed Jan 01 17:32:01 1997 | 1 | 1000 | 1000000
| Fri Feb 28 17:32:01 1997 | 1 | 1000 | 1000000 | Fri Feb 28 17:32:01 1997 | 1 | 1000 | 1000000
| Sat Mar 01 17:32:01 1997 | 1 | 1000 | 1000000 | Sat Mar 01 17:32:01 1997 | 1 | 1000 | 1000000
| Tue Dec 30 17:32:01 1997 | 4 | 1000 | 1000000 | Tue Dec 30 17:32:01 1997 | 4 | 1000 | 1000000
| Wed Dec 31 17:32:01 1997 | 4 | 1000 | 1000000 | Wed Dec 31 17:32:01 1997 | 4 | 1000 | 1000000
| Fri Dec 31 17:32:01 1999 | 4 | 1000 | 1000000 | Fri Dec 31 17:32:01 1999 | 4 | 1000 | 1000000
| Sat Jan 01 17:32:01 2000 | 1 | 1000 | 1000000 | Sat Jan 01 17:32:01 2000 | 1 | 1000 | 1000000
| Sun Dec 31 17:32:01 2000 | 4 | 1000 | 1000000 | Sun Dec 31 17:32:01 2000 | 4 | 1000 | 1000000
| Mon Jan 01 17:32:01 2001 | 1 | 1000 | 1000000 | Mon Jan 01 17:32:01 2001 | 1 | 1000 | 1000000
(55 rows) (55 rows)
SELECT '' AS "54", d1 as "timestamp", SELECT '' AS "54", d1 as "timestamp",
date_part( 'isoyear', d1) AS isoyear, date_part( 'week', d1) AS week, date_part( 'isoyear', d1) AS isoyear, date_part( 'week', d1) AS week,
date_part( 'dow', d1) AS dow date_part( 'dow', d1) AS dow
FROM TIMESTAMP_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01'; FROM TIMESTAMP_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01';
54 | timestamp | isoyear | week | dow 54 | timestamp | isoyear | week | dow
----+-----------------------------+---------+------+----- ----+----------------------------+---------+------+-----
| Thu Jan 01 00:00:00 1970 | 1970 | 1 | 4 | Thu Jan 01 00:00:00 1970 | 1970 | 1 | 4
| Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1
| Mon Feb 10 17:32:02 1997 | 1997 | 7 | 1 | Mon Feb 10 17:32:02 1997 | 1997 | 7 | 1
| Mon Feb 10 17:32:01.40 1997 | 1997 | 7 | 1 | Mon Feb 10 17:32:01.4 1997 | 1997 | 7 | 1
| Mon Feb 10 17:32:01.50 1997 | 1997 | 7 | 1 | Mon Feb 10 17:32:01.5 1997 | 1997 | 7 | 1
| Mon Feb 10 17:32:01.60 1997 | 1997 | 7 | 1 | Mon Feb 10 17:32:01.6 1997 | 1997 | 7 | 1
| Thu Jan 02 00:00:00 1997 | 1997 | 1 | 4 | Thu Jan 02 00:00:00 1997 | 1997 | 1 | 4
| Thu Jan 02 03:04:05 1997 | 1997 | 1 | 4 | Thu Jan 02 03:04:05 1997 | 1997 | 1 | 4
| Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1
| Tue Jun 10 17:32:01 1997 | 1997 | 24 | 2 | Tue Jun 10 17:32:01 1997 | 1997 | 24 | 2
| Sat Sep 22 18:19:20 2001 | 2001 | 38 | 6 | Sat Sep 22 18:19:20 2001 | 2001 | 38 | 6
| Wed Mar 15 08:14:01 2000 | 2000 | 11 | 3 | Wed Mar 15 08:14:01 2000 | 2000 | 11 | 3
| Wed Mar 15 13:14:02 2000 | 2000 | 11 | 3 | Wed Mar 15 13:14:02 2000 | 2000 | 11 | 3
| Wed Mar 15 12:14:03 2000 | 2000 | 11 | 3 | Wed Mar 15 12:14:03 2000 | 2000 | 11 | 3
| Wed Mar 15 03:14:04 2000 | 2000 | 11 | 3 | Wed Mar 15 03:14:04 2000 | 2000 | 11 | 3
| Wed Mar 15 02:14:05 2000 | 2000 | 11 | 3 | Wed Mar 15 02:14:05 2000 | 2000 | 11 | 3
| Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1
| Mon Feb 10 17:32:00 1997 | 1997 | 7 | 1 | Mon Feb 10 17:32:00 1997 | 1997 | 7 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1
| Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1
| Tue Jun 10 18:32:01 1997 | 1997 | 24 | 2 | Tue Jun 10 18:32:01 1997 | 1997 | 24 | 2
| Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1
| Tue Feb 11 17:32:01 1997 | 1997 | 7 | 2 | Tue Feb 11 17:32:01 1997 | 1997 | 7 | 2
| Wed Feb 12 17:32:01 1997 | 1997 | 7 | 3 | Wed Feb 12 17:32:01 1997 | 1997 | 7 | 3
| Thu Feb 13 17:32:01 1997 | 1997 | 7 | 4 | Thu Feb 13 17:32:01 1997 | 1997 | 7 | 4
| Fri Feb 14 17:32:01 1997 | 1997 | 7 | 5 | Fri Feb 14 17:32:01 1997 | 1997 | 7 | 5
| Sat Feb 15 17:32:01 1997 | 1997 | 7 | 6 | Sat Feb 15 17:32:01 1997 | 1997 | 7 | 6
| Sun Feb 16 17:32:01 1997 | 1997 | 7 | 0 | Sun Feb 16 17:32:01 1997 | 1997 | 7 | 0
| Sun Feb 16 17:32:01 1997 | 1997 | 7 | 0 | Sun Feb 16 17:32:01 1997 | 1997 | 7 | 0
| Wed Feb 28 17:32:01 1996 | 1996 | 9 | 3 | Wed Feb 28 17:32:01 1996 | 1996 | 9 | 3
| Thu Feb 29 17:32:01 1996 | 1996 | 9 | 4 | Thu Feb 29 17:32:01 1996 | 1996 | 9 | 4
| Fri Mar 01 17:32:01 1996 | 1996 | 9 | 5 | Fri Mar 01 17:32:01 1996 | 1996 | 9 | 5
| Mon Dec 30 17:32:01 1996 | 1997 | 1 | 1 | Mon Dec 30 17:32:01 1996 | 1997 | 1 | 1
| Tue Dec 31 17:32:01 1996 | 1997 | 1 | 2 | Tue Dec 31 17:32:01 1996 | 1997 | 1 | 2
| Wed Jan 01 17:32:01 1997 | 1997 | 1 | 3 | Wed Jan 01 17:32:01 1997 | 1997 | 1 | 3
| Fri Feb 28 17:32:01 1997 | 1997 | 9 | 5 | Fri Feb 28 17:32:01 1997 | 1997 | 9 | 5
| Sat Mar 01 17:32:01 1997 | 1997 | 9 | 6 | Sat Mar 01 17:32:01 1997 | 1997 | 9 | 6
| Tue Dec 30 17:32:01 1997 | 1998 | 1 | 2 | Tue Dec 30 17:32:01 1997 | 1998 | 1 | 2
| Wed Dec 31 17:32:01 1997 | 1998 | 1 | 3 | Wed Dec 31 17:32:01 1997 | 1998 | 1 | 3
| Fri Dec 31 17:32:01 1999 | 1999 | 52 | 5 | Fri Dec 31 17:32:01 1999 | 1999 | 52 | 5
| Sat Jan 01 17:32:01 2000 | 1999 | 52 | 6 | Sat Jan 01 17:32:01 2000 | 1999 | 52 | 6
| Sun Dec 31 17:32:01 2000 | 2000 | 52 | 0 | Sun Dec 31 17:32:01 2000 | 2000 | 52 | 0
| Mon Jan 01 17:32:01 2001 | 2001 | 1 | 1 | Mon Jan 01 17:32:01 2001 | 2001 | 1 | 1
(55 rows) (55 rows)
-- TO_CHAR() -- TO_CHAR()
......
...@@ -264,9 +264,9 @@ SELECT '' AS "64", d1 FROM TIMESTAMPTZ_TBL; ...@@ -264,9 +264,9 @@ SELECT '' AS "64", d1 FROM TIMESTAMPTZ_TBL;
| Mon Feb 10 17:32:01 1997 PST | Mon Feb 10 17:32:01 1997 PST
| Mon Feb 10 17:32:01 1997 PST | Mon Feb 10 17:32:01 1997 PST
| Mon Feb 10 17:32:02 1997 PST | Mon Feb 10 17:32:02 1997 PST
| Mon Feb 10 17:32:01.40 1997 PST | Mon Feb 10 17:32:01.4 1997 PST
| Mon Feb 10 17:32:01.50 1997 PST | Mon Feb 10 17:32:01.5 1997 PST
| Mon Feb 10 17:32:01.60 1997 PST | Mon Feb 10 17:32:01.6 1997 PST
| Thu Jan 02 00:00:00 1997 PST | Thu Jan 02 00:00:00 1997 PST
| Thu Jan 02 03:04:05 1997 PST | Thu Jan 02 03:04:05 1997 PST
| Mon Feb 10 17:32:01 1997 PST | Mon Feb 10 17:32:01 1997 PST
...@@ -329,15 +329,15 @@ SELECT '' AS "64", d1 FROM TIMESTAMPTZ_TBL; ...@@ -329,15 +329,15 @@ SELECT '' AS "64", d1 FROM TIMESTAMPTZ_TBL;
-- Demonstrate functions and operators -- Demonstrate functions and operators
SELECT '' AS "48", d1 FROM TIMESTAMPTZ_TBL SELECT '' AS "48", d1 FROM TIMESTAMPTZ_TBL
WHERE d1 > timestamp with time zone '1997-01-02'; WHERE d1 > timestamp with time zone '1997-01-02';
48 | d1 48 | d1
----+--------------------------------- ----+--------------------------------
| infinity | infinity
| Mon Feb 10 17:32:01 1997 PST | Mon Feb 10 17:32:01 1997 PST
| Mon Feb 10 17:32:01 1997 PST | Mon Feb 10 17:32:01 1997 PST
| Mon Feb 10 17:32:02 1997 PST | Mon Feb 10 17:32:02 1997 PST
| Mon Feb 10 17:32:01.40 1997 PST | Mon Feb 10 17:32:01.4 1997 PST
| Mon Feb 10 17:32:01.50 1997 PST | Mon Feb 10 17:32:01.5 1997 PST
| Mon Feb 10 17:32:01.60 1997 PST | Mon Feb 10 17:32:01.6 1997 PST
| Thu Jan 02 03:04:05 1997 PST | Thu Jan 02 03:04:05 1997 PST
| Mon Feb 10 17:32:01 1997 PST | Mon Feb 10 17:32:01 1997 PST
| Mon Feb 10 17:32:01 1997 PST | Mon Feb 10 17:32:01 1997 PST
...@@ -421,9 +421,9 @@ SELECT '' AS "63", d1 FROM TIMESTAMPTZ_TBL ...@@ -421,9 +421,9 @@ SELECT '' AS "63", d1 FROM TIMESTAMPTZ_TBL
| Mon Feb 10 17:32:01 1997 PST | Mon Feb 10 17:32:01 1997 PST
| Mon Feb 10 17:32:01 1997 PST | Mon Feb 10 17:32:01 1997 PST
| Mon Feb 10 17:32:02 1997 PST | Mon Feb 10 17:32:02 1997 PST
| Mon Feb 10 17:32:01.40 1997 PST | Mon Feb 10 17:32:01.4 1997 PST
| Mon Feb 10 17:32:01.50 1997 PST | Mon Feb 10 17:32:01.5 1997 PST
| Mon Feb 10 17:32:01.60 1997 PST | Mon Feb 10 17:32:01.6 1997 PST
| Thu Jan 02 03:04:05 1997 PST | Thu Jan 02 03:04:05 1997 PST
| Mon Feb 10 17:32:01 1997 PST | Mon Feb 10 17:32:01 1997 PST
| Mon Feb 10 17:32:01 1997 PST | Mon Feb 10 17:32:01 1997 PST
...@@ -506,15 +506,15 @@ SELECT '' AS "16", d1 FROM TIMESTAMPTZ_TBL ...@@ -506,15 +506,15 @@ SELECT '' AS "16", d1 FROM TIMESTAMPTZ_TBL
SELECT '' AS "49", d1 FROM TIMESTAMPTZ_TBL SELECT '' AS "49", d1 FROM TIMESTAMPTZ_TBL
WHERE d1 >= timestamp with time zone '1997-01-02'; WHERE d1 >= timestamp with time zone '1997-01-02';
49 | d1 49 | d1
----+--------------------------------- ----+--------------------------------
| infinity | infinity
| Mon Feb 10 17:32:01 1997 PST | Mon Feb 10 17:32:01 1997 PST
| Mon Feb 10 17:32:01 1997 PST | Mon Feb 10 17:32:01 1997 PST
| Mon Feb 10 17:32:02 1997 PST | Mon Feb 10 17:32:02 1997 PST
| Mon Feb 10 17:32:01.40 1997 PST | Mon Feb 10 17:32:01.4 1997 PST
| Mon Feb 10 17:32:01.50 1997 PST | Mon Feb 10 17:32:01.5 1997 PST
| Mon Feb 10 17:32:01.60 1997 PST | Mon Feb 10 17:32:01.6 1997 PST
| Thu Jan 02 00:00:00 1997 PST | Thu Jan 02 00:00:00 1997 PST
| Thu Jan 02 03:04:05 1997 PST | Thu Jan 02 03:04:05 1997 PST
| Mon Feb 10 17:32:01 1997 PST | Mon Feb 10 17:32:01 1997 PST
...@@ -569,9 +569,9 @@ SELECT '' AS "54", d1 - timestamp with time zone '1997-01-02' AS diff ...@@ -569,9 +569,9 @@ SELECT '' AS "54", d1 - timestamp with time zone '1997-01-02' AS diff
| @ 39 days 17 hours 32 mins 1 sec | @ 39 days 17 hours 32 mins 1 sec
| @ 39 days 17 hours 32 mins 1 sec | @ 39 days 17 hours 32 mins 1 sec
| @ 39 days 17 hours 32 mins 2 secs | @ 39 days 17 hours 32 mins 2 secs
| @ 39 days 17 hours 32 mins 1.40 secs | @ 39 days 17 hours 32 mins 1.4 secs
| @ 39 days 17 hours 32 mins 1.50 secs | @ 39 days 17 hours 32 mins 1.5 secs
| @ 39 days 17 hours 32 mins 1.60 secs | @ 39 days 17 hours 32 mins 1.6 secs
| @ 0 | @ 0
| @ 3 hours 4 mins 5 secs | @ 3 hours 4 mins 5 secs
| @ 39 days 17 hours 32 mins 1 sec | @ 39 days 17 hours 32 mins 1 sec
...@@ -639,9 +639,9 @@ SELECT '' AS "54", d1 - timestamp with time zone '1997-01-02' AS diff ...@@ -639,9 +639,9 @@ SELECT '' AS "54", d1 - timestamp with time zone '1997-01-02' AS diff
| @ 39 days 17 hours 32 mins 1 sec | @ 39 days 17 hours 32 mins 1 sec
| @ 39 days 17 hours 32 mins 1 sec | @ 39 days 17 hours 32 mins 1 sec
| @ 39 days 17 hours 32 mins 2 secs | @ 39 days 17 hours 32 mins 2 secs
| @ 39 days 17 hours 32 mins 1.40 secs | @ 39 days 17 hours 32 mins 1.4 secs
| @ 39 days 17 hours 32 mins 1.50 secs | @ 39 days 17 hours 32 mins 1.5 secs
| @ 39 days 17 hours 32 mins 1.60 secs | @ 39 days 17 hours 32 mins 1.6 secs
| @ 0 | @ 0
| @ 3 hours 4 mins 5 secs | @ 3 hours 4 mins 5 secs
| @ 39 days 17 hours 32 mins 1 sec | @ 39 days 17 hours 32 mins 1 sec
...@@ -698,192 +698,192 @@ SELECT '' AS "54", d1 as timestamptz, ...@@ -698,192 +698,192 @@ SELECT '' AS "54", d1 as timestamptz,
date_part( 'day', d1) AS day, date_part( 'hour', d1) AS hour, date_part( 'day', d1) AS day, date_part( 'hour', d1) AS hour,
date_part( 'minute', d1) AS minute, date_part( 'second', d1) AS second date_part( 'minute', d1) AS minute, date_part( 'second', d1) AS second
FROM TIMESTAMPTZ_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01'; FROM TIMESTAMPTZ_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01';
54 | timestamptz | year | month | day | hour | minute | second 54 | timestamptz | year | month | day | hour | minute | second
----+---------------------------------+------+-------+-----+------+--------+-------- ----+--------------------------------+------+-------+-----+------+--------+--------
| Wed Dec 31 16:00:00 1969 PST | 1969 | 12 | 31 | 16 | 0 | 0 | Wed Dec 31 16:00:00 1969 PST | 1969 | 12 | 31 | 16 | 0 | 0
| Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:02 1997 PST | 1997 | 2 | 10 | 17 | 32 | 2 | Mon Feb 10 17:32:02 1997 PST | 1997 | 2 | 10 | 17 | 32 | 2
| Mon Feb 10 17:32:01.40 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1.4 | Mon Feb 10 17:32:01.4 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1.4
| Mon Feb 10 17:32:01.50 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1.5 | Mon Feb 10 17:32:01.5 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1.5
| Mon Feb 10 17:32:01.60 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1.6 | Mon Feb 10 17:32:01.6 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1.6
| Thu Jan 02 00:00:00 1997 PST | 1997 | 1 | 2 | 0 | 0 | 0 | Thu Jan 02 00:00:00 1997 PST | 1997 | 1 | 2 | 0 | 0 | 0
| Thu Jan 02 03:04:05 1997 PST | 1997 | 1 | 2 | 3 | 4 | 5 | Thu Jan 02 03:04:05 1997 PST | 1997 | 1 | 2 | 3 | 4 | 5
| Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1
| Tue Jun 10 17:32:01 1997 PDT | 1997 | 6 | 10 | 17 | 32 | 1 | Tue Jun 10 17:32:01 1997 PDT | 1997 | 6 | 10 | 17 | 32 | 1
| Sat Sep 22 18:19:20 2001 PDT | 2001 | 9 | 22 | 18 | 19 | 20 | Sat Sep 22 18:19:20 2001 PDT | 2001 | 9 | 22 | 18 | 19 | 20
| Wed Mar 15 08:14:01 2000 PST | 2000 | 3 | 15 | 8 | 14 | 1 | Wed Mar 15 08:14:01 2000 PST | 2000 | 3 | 15 | 8 | 14 | 1
| Wed Mar 15 04:14:02 2000 PST | 2000 | 3 | 15 | 4 | 14 | 2 | Wed Mar 15 04:14:02 2000 PST | 2000 | 3 | 15 | 4 | 14 | 2
| Wed Mar 15 02:14:03 2000 PST | 2000 | 3 | 15 | 2 | 14 | 3 | Wed Mar 15 02:14:03 2000 PST | 2000 | 3 | 15 | 2 | 14 | 3
| Wed Mar 15 03:14:04 2000 PST | 2000 | 3 | 15 | 3 | 14 | 4 | Wed Mar 15 03:14:04 2000 PST | 2000 | 3 | 15 | 3 | 14 | 4
| Wed Mar 15 01:14:05 2000 PST | 2000 | 3 | 15 | 1 | 14 | 5 | Wed Mar 15 01:14:05 2000 PST | 2000 | 3 | 15 | 1 | 14 | 5
| Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:00 1997 PST | 1997 | 2 | 10 | 17 | 32 | 0 | Mon Feb 10 17:32:00 1997 PST | 1997 | 2 | 10 | 17 | 32 | 0
| Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1
| Mon Feb 10 09:32:01 1997 PST | 1997 | 2 | 10 | 9 | 32 | 1 | Mon Feb 10 09:32:01 1997 PST | 1997 | 2 | 10 | 9 | 32 | 1
| Mon Feb 10 09:32:01 1997 PST | 1997 | 2 | 10 | 9 | 32 | 1 | Mon Feb 10 09:32:01 1997 PST | 1997 | 2 | 10 | 9 | 32 | 1
| Mon Feb 10 09:32:01 1997 PST | 1997 | 2 | 10 | 9 | 32 | 1 | Mon Feb 10 09:32:01 1997 PST | 1997 | 2 | 10 | 9 | 32 | 1
| Mon Feb 10 14:32:01 1997 PST | 1997 | 2 | 10 | 14 | 32 | 1 | Mon Feb 10 14:32:01 1997 PST | 1997 | 2 | 10 | 14 | 32 | 1
| Thu Jul 10 14:32:01 1997 PDT | 1997 | 7 | 10 | 14 | 32 | 1 | Thu Jul 10 14:32:01 1997 PDT | 1997 | 7 | 10 | 14 | 32 | 1
| Tue Jun 10 18:32:01 1997 PDT | 1997 | 6 | 10 | 18 | 32 | 1 | Tue Jun 10 18:32:01 1997 PDT | 1997 | 6 | 10 | 18 | 32 | 1
| Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1
| Tue Feb 11 17:32:01 1997 PST | 1997 | 2 | 11 | 17 | 32 | 1 | Tue Feb 11 17:32:01 1997 PST | 1997 | 2 | 11 | 17 | 32 | 1
| Wed Feb 12 17:32:01 1997 PST | 1997 | 2 | 12 | 17 | 32 | 1 | Wed Feb 12 17:32:01 1997 PST | 1997 | 2 | 12 | 17 | 32 | 1
| Thu Feb 13 17:32:01 1997 PST | 1997 | 2 | 13 | 17 | 32 | 1 | Thu Feb 13 17:32:01 1997 PST | 1997 | 2 | 13 | 17 | 32 | 1
| Fri Feb 14 17:32:01 1997 PST | 1997 | 2 | 14 | 17 | 32 | 1 | Fri Feb 14 17:32:01 1997 PST | 1997 | 2 | 14 | 17 | 32 | 1
| Sat Feb 15 17:32:01 1997 PST | 1997 | 2 | 15 | 17 | 32 | 1 | Sat Feb 15 17:32:01 1997 PST | 1997 | 2 | 15 | 17 | 32 | 1
| Sun Feb 16 17:32:01 1997 PST | 1997 | 2 | 16 | 17 | 32 | 1 | Sun Feb 16 17:32:01 1997 PST | 1997 | 2 | 16 | 17 | 32 | 1
| Sun Feb 16 17:32:01 1997 PST | 1997 | 2 | 16 | 17 | 32 | 1 | Sun Feb 16 17:32:01 1997 PST | 1997 | 2 | 16 | 17 | 32 | 1
| Wed Feb 28 17:32:01 1996 PST | 1996 | 2 | 28 | 17 | 32 | 1 | Wed Feb 28 17:32:01 1996 PST | 1996 | 2 | 28 | 17 | 32 | 1
| Thu Feb 29 17:32:01 1996 PST | 1996 | 2 | 29 | 17 | 32 | 1 | Thu Feb 29 17:32:01 1996 PST | 1996 | 2 | 29 | 17 | 32 | 1
| Fri Mar 01 17:32:01 1996 PST | 1996 | 3 | 1 | 17 | 32 | 1 | Fri Mar 01 17:32:01 1996 PST | 1996 | 3 | 1 | 17 | 32 | 1
| Mon Dec 30 17:32:01 1996 PST | 1996 | 12 | 30 | 17 | 32 | 1 | Mon Dec 30 17:32:01 1996 PST | 1996 | 12 | 30 | 17 | 32 | 1
| Tue Dec 31 17:32:01 1996 PST | 1996 | 12 | 31 | 17 | 32 | 1 | Tue Dec 31 17:32:01 1996 PST | 1996 | 12 | 31 | 17 | 32 | 1
| Wed Jan 01 17:32:01 1997 PST | 1997 | 1 | 1 | 17 | 32 | 1 | Wed Jan 01 17:32:01 1997 PST | 1997 | 1 | 1 | 17 | 32 | 1
| Fri Feb 28 17:32:01 1997 PST | 1997 | 2 | 28 | 17 | 32 | 1 | Fri Feb 28 17:32:01 1997 PST | 1997 | 2 | 28 | 17 | 32 | 1
| Sat Mar 01 17:32:01 1997 PST | 1997 | 3 | 1 | 17 | 32 | 1 | Sat Mar 01 17:32:01 1997 PST | 1997 | 3 | 1 | 17 | 32 | 1
| Tue Dec 30 17:32:01 1997 PST | 1997 | 12 | 30 | 17 | 32 | 1 | Tue Dec 30 17:32:01 1997 PST | 1997 | 12 | 30 | 17 | 32 | 1
| Wed Dec 31 17:32:01 1997 PST | 1997 | 12 | 31 | 17 | 32 | 1 | Wed Dec 31 17:32:01 1997 PST | 1997 | 12 | 31 | 17 | 32 | 1
| Fri Dec 31 17:32:01 1999 PST | 1999 | 12 | 31 | 17 | 32 | 1 | Fri Dec 31 17:32:01 1999 PST | 1999 | 12 | 31 | 17 | 32 | 1
| Sat Jan 01 17:32:01 2000 PST | 2000 | 1 | 1 | 17 | 32 | 1 | Sat Jan 01 17:32:01 2000 PST | 2000 | 1 | 1 | 17 | 32 | 1
| Sun Dec 31 17:32:01 2000 PST | 2000 | 12 | 31 | 17 | 32 | 1 | Sun Dec 31 17:32:01 2000 PST | 2000 | 12 | 31 | 17 | 32 | 1
| Mon Jan 01 17:32:01 2001 PST | 2001 | 1 | 1 | 17 | 32 | 1 | Mon Jan 01 17:32:01 2001 PST | 2001 | 1 | 1 | 17 | 32 | 1
(56 rows) (56 rows)
SELECT '' AS "54", d1 as timestamptz, SELECT '' AS "54", d1 as timestamptz,
date_part( 'quarter', d1) AS quarter, date_part( 'msec', d1) AS msec, date_part( 'quarter', d1) AS quarter, date_part( 'msec', d1) AS msec,
date_part( 'usec', d1) AS usec date_part( 'usec', d1) AS usec
FROM TIMESTAMPTZ_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01'; FROM TIMESTAMPTZ_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01';
54 | timestamptz | quarter | msec | usec 54 | timestamptz | quarter | msec | usec
----+---------------------------------+---------+-------+---------- ----+--------------------------------+---------+-------+----------
| Wed Dec 31 16:00:00 1969 PST | 4 | 0 | 0 | Wed Dec 31 16:00:00 1969 PST | 4 | 0 | 0
| Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000
| Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000
| Mon Feb 10 17:32:02 1997 PST | 1 | 2000 | 2000000 | Mon Feb 10 17:32:02 1997 PST | 1 | 2000 | 2000000
| Mon Feb 10 17:32:01.40 1997 PST | 1 | 1400 | 1400000 | Mon Feb 10 17:32:01.4 1997 PST | 1 | 1400 | 1400000
| Mon Feb 10 17:32:01.50 1997 PST | 1 | 1500 | 1500000 | Mon Feb 10 17:32:01.5 1997 PST | 1 | 1500 | 1500000
| Mon Feb 10 17:32:01.60 1997 PST | 1 | 1600 | 1600000 | Mon Feb 10 17:32:01.6 1997 PST | 1 | 1600 | 1600000
| Thu Jan 02 00:00:00 1997 PST | 1 | 0 | 0 | Thu Jan 02 00:00:00 1997 PST | 1 | 0 | 0
| Thu Jan 02 03:04:05 1997 PST | 1 | 5000 | 5000000 | Thu Jan 02 03:04:05 1997 PST | 1 | 5000 | 5000000
| Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000
| Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000
| Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000
| Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000
| Tue Jun 10 17:32:01 1997 PDT | 2 | 1000 | 1000000 | Tue Jun 10 17:32:01 1997 PDT | 2 | 1000 | 1000000
| Sat Sep 22 18:19:20 2001 PDT | 3 | 20000 | 20000000 | Sat Sep 22 18:19:20 2001 PDT | 3 | 20000 | 20000000
| Wed Mar 15 08:14:01 2000 PST | 1 | 1000 | 1000000 | Wed Mar 15 08:14:01 2000 PST | 1 | 1000 | 1000000
| Wed Mar 15 04:14:02 2000 PST | 1 | 2000 | 2000000 | Wed Mar 15 04:14:02 2000 PST | 1 | 2000 | 2000000
| Wed Mar 15 02:14:03 2000 PST | 1 | 3000 | 3000000 | Wed Mar 15 02:14:03 2000 PST | 1 | 3000 | 3000000
| Wed Mar 15 03:14:04 2000 PST | 1 | 4000 | 4000000 | Wed Mar 15 03:14:04 2000 PST | 1 | 4000 | 4000000
| Wed Mar 15 01:14:05 2000 PST | 1 | 5000 | 5000000 | Wed Mar 15 01:14:05 2000 PST | 1 | 5000 | 5000000
| Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000
| Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000
| Mon Feb 10 17:32:00 1997 PST | 1 | 0 | 0 | Mon Feb 10 17:32:00 1997 PST | 1 | 0 | 0
| Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000
| Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000
| Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000
| Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000
| Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000
| Mon Feb 10 09:32:01 1997 PST | 1 | 1000 | 1000000 | Mon Feb 10 09:32:01 1997 PST | 1 | 1000 | 1000000
| Mon Feb 10 09:32:01 1997 PST | 1 | 1000 | 1000000 | Mon Feb 10 09:32:01 1997 PST | 1 | 1000 | 1000000
| Mon Feb 10 09:32:01 1997 PST | 1 | 1000 | 1000000 | Mon Feb 10 09:32:01 1997 PST | 1 | 1000 | 1000000
| Mon Feb 10 14:32:01 1997 PST | 1 | 1000 | 1000000 | Mon Feb 10 14:32:01 1997 PST | 1 | 1000 | 1000000
| Thu Jul 10 14:32:01 1997 PDT | 3 | 1000 | 1000000 | Thu Jul 10 14:32:01 1997 PDT | 3 | 1000 | 1000000
| Tue Jun 10 18:32:01 1997 PDT | 2 | 1000 | 1000000 | Tue Jun 10 18:32:01 1997 PDT | 2 | 1000 | 1000000
| Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000 | Mon Feb 10 17:32:01 1997 PST | 1 | 1000 | 1000000
| Tue Feb 11 17:32:01 1997 PST | 1 | 1000 | 1000000 | Tue Feb 11 17:32:01 1997 PST | 1 | 1000 | 1000000
| Wed Feb 12 17:32:01 1997 PST | 1 | 1000 | 1000000 | Wed Feb 12 17:32:01 1997 PST | 1 | 1000 | 1000000
| Thu Feb 13 17:32:01 1997 PST | 1 | 1000 | 1000000 | Thu Feb 13 17:32:01 1997 PST | 1 | 1000 | 1000000
| Fri Feb 14 17:32:01 1997 PST | 1 | 1000 | 1000000 | Fri Feb 14 17:32:01 1997 PST | 1 | 1000 | 1000000
| Sat Feb 15 17:32:01 1997 PST | 1 | 1000 | 1000000 | Sat Feb 15 17:32:01 1997 PST | 1 | 1000 | 1000000
| Sun Feb 16 17:32:01 1997 PST | 1 | 1000 | 1000000 | Sun Feb 16 17:32:01 1997 PST | 1 | 1000 | 1000000
| Sun Feb 16 17:32:01 1997 PST | 1 | 1000 | 1000000 | Sun Feb 16 17:32:01 1997 PST | 1 | 1000 | 1000000
| Wed Feb 28 17:32:01 1996 PST | 1 | 1000 | 1000000 | Wed Feb 28 17:32:01 1996 PST | 1 | 1000 | 1000000
| Thu Feb 29 17:32:01 1996 PST | 1 | 1000 | 1000000 | Thu Feb 29 17:32:01 1996 PST | 1 | 1000 | 1000000
| Fri Mar 01 17:32:01 1996 PST | 1 | 1000 | 1000000 | Fri Mar 01 17:32:01 1996 PST | 1 | 1000 | 1000000
| Mon Dec 30 17:32:01 1996 PST | 4 | 1000 | 1000000 | Mon Dec 30 17:32:01 1996 PST | 4 | 1000 | 1000000
| Tue Dec 31 17:32:01 1996 PST | 4 | 1000 | 1000000 | Tue Dec 31 17:32:01 1996 PST | 4 | 1000 | 1000000
| Wed Jan 01 17:32:01 1997 PST | 1 | 1000 | 1000000 | Wed Jan 01 17:32:01 1997 PST | 1 | 1000 | 1000000
| Fri Feb 28 17:32:01 1997 PST | 1 | 1000 | 1000000 | Fri Feb 28 17:32:01 1997 PST | 1 | 1000 | 1000000
| Sat Mar 01 17:32:01 1997 PST | 1 | 1000 | 1000000 | Sat Mar 01 17:32:01 1997 PST | 1 | 1000 | 1000000
| Tue Dec 30 17:32:01 1997 PST | 4 | 1000 | 1000000 | Tue Dec 30 17:32:01 1997 PST | 4 | 1000 | 1000000
| Wed Dec 31 17:32:01 1997 PST | 4 | 1000 | 1000000 | Wed Dec 31 17:32:01 1997 PST | 4 | 1000 | 1000000
| Fri Dec 31 17:32:01 1999 PST | 4 | 1000 | 1000000 | Fri Dec 31 17:32:01 1999 PST | 4 | 1000 | 1000000
| Sat Jan 01 17:32:01 2000 PST | 1 | 1000 | 1000000 | Sat Jan 01 17:32:01 2000 PST | 1 | 1000 | 1000000
| Sun Dec 31 17:32:01 2000 PST | 4 | 1000 | 1000000 | Sun Dec 31 17:32:01 2000 PST | 4 | 1000 | 1000000
| Mon Jan 01 17:32:01 2001 PST | 1 | 1000 | 1000000 | Mon Jan 01 17:32:01 2001 PST | 1 | 1000 | 1000000
(56 rows) (56 rows)
SELECT '' AS "54", d1 as timestamptz, SELECT '' AS "54", d1 as timestamptz,
date_part( 'isoyear', d1) AS isoyear, date_part( 'week', d1) AS week, date_part( 'isoyear', d1) AS isoyear, date_part( 'week', d1) AS week,
date_part( 'dow', d1) AS dow date_part( 'dow', d1) AS dow
FROM TIMESTAMPTZ_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01'; FROM TIMESTAMPTZ_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01';
54 | timestamptz | isoyear | week | dow 54 | timestamptz | isoyear | week | dow
----+---------------------------------+---------+------+----- ----+--------------------------------+---------+------+-----
| Wed Dec 31 16:00:00 1969 PST | 1970 | 1 | 3 | Wed Dec 31 16:00:00 1969 PST | 1970 | 1 | 3
| Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1
| Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1
| Mon Feb 10 17:32:02 1997 PST | 1997 | 7 | 1 | Mon Feb 10 17:32:02 1997 PST | 1997 | 7 | 1
| Mon Feb 10 17:32:01.40 1997 PST | 1997 | 7 | 1 | Mon Feb 10 17:32:01.4 1997 PST | 1997 | 7 | 1
| Mon Feb 10 17:32:01.50 1997 PST | 1997 | 7 | 1 | Mon Feb 10 17:32:01.5 1997 PST | 1997 | 7 | 1
| Mon Feb 10 17:32:01.60 1997 PST | 1997 | 7 | 1 | Mon Feb 10 17:32:01.6 1997 PST | 1997 | 7 | 1
| Thu Jan 02 00:00:00 1997 PST | 1997 | 1 | 4 | Thu Jan 02 00:00:00 1997 PST | 1997 | 1 | 4
| Thu Jan 02 03:04:05 1997 PST | 1997 | 1 | 4 | Thu Jan 02 03:04:05 1997 PST | 1997 | 1 | 4
| Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1
| Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1
| Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1
| Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1
| Tue Jun 10 17:32:01 1997 PDT | 1997 | 24 | 2 | Tue Jun 10 17:32:01 1997 PDT | 1997 | 24 | 2
| Sat Sep 22 18:19:20 2001 PDT | 2001 | 38 | 6 | Sat Sep 22 18:19:20 2001 PDT | 2001 | 38 | 6
| Wed Mar 15 08:14:01 2000 PST | 2000 | 11 | 3 | Wed Mar 15 08:14:01 2000 PST | 2000 | 11 | 3
| Wed Mar 15 04:14:02 2000 PST | 2000 | 11 | 3 | Wed Mar 15 04:14:02 2000 PST | 2000 | 11 | 3
| Wed Mar 15 02:14:03 2000 PST | 2000 | 11 | 3 | Wed Mar 15 02:14:03 2000 PST | 2000 | 11 | 3
| Wed Mar 15 03:14:04 2000 PST | 2000 | 11 | 3 | Wed Mar 15 03:14:04 2000 PST | 2000 | 11 | 3
| Wed Mar 15 01:14:05 2000 PST | 2000 | 11 | 3 | Wed Mar 15 01:14:05 2000 PST | 2000 | 11 | 3
| Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1
| Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1
| Mon Feb 10 17:32:00 1997 PST | 1997 | 7 | 1 | Mon Feb 10 17:32:00 1997 PST | 1997 | 7 | 1
| Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1
| Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1
| Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1
| Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1
| Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1
| Mon Feb 10 09:32:01 1997 PST | 1997 | 7 | 1 | Mon Feb 10 09:32:01 1997 PST | 1997 | 7 | 1
| Mon Feb 10 09:32:01 1997 PST | 1997 | 7 | 1 | Mon Feb 10 09:32:01 1997 PST | 1997 | 7 | 1
| Mon Feb 10 09:32:01 1997 PST | 1997 | 7 | 1 | Mon Feb 10 09:32:01 1997 PST | 1997 | 7 | 1
| Mon Feb 10 14:32:01 1997 PST | 1997 | 7 | 1 | Mon Feb 10 14:32:01 1997 PST | 1997 | 7 | 1
| Thu Jul 10 14:32:01 1997 PDT | 1997 | 28 | 4 | Thu Jul 10 14:32:01 1997 PDT | 1997 | 28 | 4
| Tue Jun 10 18:32:01 1997 PDT | 1997 | 24 | 2 | Tue Jun 10 18:32:01 1997 PDT | 1997 | 24 | 2
| Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 | Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1
| Tue Feb 11 17:32:01 1997 PST | 1997 | 7 | 2 | Tue Feb 11 17:32:01 1997 PST | 1997 | 7 | 2
| Wed Feb 12 17:32:01 1997 PST | 1997 | 7 | 3 | Wed Feb 12 17:32:01 1997 PST | 1997 | 7 | 3
| Thu Feb 13 17:32:01 1997 PST | 1997 | 7 | 4 | Thu Feb 13 17:32:01 1997 PST | 1997 | 7 | 4
| Fri Feb 14 17:32:01 1997 PST | 1997 | 7 | 5 | Fri Feb 14 17:32:01 1997 PST | 1997 | 7 | 5
| Sat Feb 15 17:32:01 1997 PST | 1997 | 7 | 6 | Sat Feb 15 17:32:01 1997 PST | 1997 | 7 | 6
| Sun Feb 16 17:32:01 1997 PST | 1997 | 7 | 0 | Sun Feb 16 17:32:01 1997 PST | 1997 | 7 | 0
| Sun Feb 16 17:32:01 1997 PST | 1997 | 7 | 0 | Sun Feb 16 17:32:01 1997 PST | 1997 | 7 | 0
| Wed Feb 28 17:32:01 1996 PST | 1996 | 9 | 3 | Wed Feb 28 17:32:01 1996 PST | 1996 | 9 | 3
| Thu Feb 29 17:32:01 1996 PST | 1996 | 9 | 4 | Thu Feb 29 17:32:01 1996 PST | 1996 | 9 | 4
| Fri Mar 01 17:32:01 1996 PST | 1996 | 9 | 5 | Fri Mar 01 17:32:01 1996 PST | 1996 | 9 | 5
| Mon Dec 30 17:32:01 1996 PST | 1997 | 1 | 1 | Mon Dec 30 17:32:01 1996 PST | 1997 | 1 | 1
| Tue Dec 31 17:32:01 1996 PST | 1997 | 1 | 2 | Tue Dec 31 17:32:01 1996 PST | 1997 | 1 | 2
| Wed Jan 01 17:32:01 1997 PST | 1997 | 1 | 3 | Wed Jan 01 17:32:01 1997 PST | 1997 | 1 | 3
| Fri Feb 28 17:32:01 1997 PST | 1997 | 9 | 5 | Fri Feb 28 17:32:01 1997 PST | 1997 | 9 | 5
| Sat Mar 01 17:32:01 1997 PST | 1997 | 9 | 6 | Sat Mar 01 17:32:01 1997 PST | 1997 | 9 | 6
| Tue Dec 30 17:32:01 1997 PST | 1998 | 1 | 2 | Tue Dec 30 17:32:01 1997 PST | 1998 | 1 | 2
| Wed Dec 31 17:32:01 1997 PST | 1998 | 1 | 3 | Wed Dec 31 17:32:01 1997 PST | 1998 | 1 | 3
| Fri Dec 31 17:32:01 1999 PST | 1999 | 52 | 5 | Fri Dec 31 17:32:01 1999 PST | 1999 | 52 | 5
| Sat Jan 01 17:32:01 2000 PST | 1999 | 52 | 6 | Sat Jan 01 17:32:01 2000 PST | 1999 | 52 | 6
| Sun Dec 31 17:32:01 2000 PST | 2000 | 52 | 0 | Sun Dec 31 17:32:01 2000 PST | 2000 | 52 | 0
| Mon Jan 01 17:32:01 2001 PST | 2001 | 1 | 1 | Mon Jan 01 17:32:01 2001 PST | 2001 | 1 | 1
(56 rows) (56 rows)
-- TO_CHAR() -- TO_CHAR()
......
...@@ -235,3 +235,9 @@ select interval 'P0002' AS "year only", ...@@ -235,3 +235,9 @@ select interval 'P0002' AS "year only",
interval 'P0002-10-15T1S' AS "year month day plus time", interval 'P0002-10-15T1S' AS "year month day plus time",
interval 'PT10' AS "hour only", interval 'PT10' AS "hour only",
interval 'PT10:30' AS "hour minute"; interval 'PT10:30' AS "hour minute";
-- test a couple rounding cases that changed since 8.3 w/ HAVE_INT64_TIMESTAMP.
SET IntervalStyle to postgres_verbose;
select interval '-10 mons -3 days +03:55:06.70';
select interval '1 year 2 mons 3 days 04:05:06.699999';
select interval '0:0:0.7', interval '@ 0.70 secs', interval '0.7 seconds';
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment