diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c index ef61b3eb56..5071ed4c3c 100644 --- a/src/backend/utils/adt/datetime.c +++ b/src/backend/utils/adt/datetime.c @@ -8,7 +8,7 @@ * * * 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 @@ #include "funcapi.h" #include "miscadmin.h" #include "utils/builtins.h" +#include "utils/date.h" #include "utils/datetime.h" #include "utils/memutils.h" #include "utils/tzparser.h" @@ -44,6 +45,12 @@ static int DecodeDate(char *str, int fmask, int *tmask, bool *is2digits, static int ValidateDate(int fmask, bool is2digits, bool bc, struct pg_tm * tm); 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] = @@ -401,29 +408,130 @@ GetCurrentTimeUsec(struct pg_tm * tm, fsec_t *fsec, int *tzp) /* TrimTrailingZeros() * ... 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 TrimTrailingZeros(char *str) { int len = strlen(str); -#if 0 - /* chop off trailing one to cope with interval rounding */ - if (strcmp(str + len - 4, "0001") == 0) - { - len -= 4; - *(str + len) = '\0'; - } -#endif - - /* chop off trailing zeros... but leave at least 2 fractional digits */ - while (*(str + len - 1) == '0' && *(str + len - 3) != '.') + while (len > 1 && *(str + len - 1) == '0' && *(str + len - 2) != '.') { len--; *(str + len) = '\0'; } } +/* + * 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) + { + if (fillzeros) + 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() * Break string into tokens based on a date/time context. * Returns 0 if successful, DTERR code if bogus input detected. @@ -943,16 +1051,9 @@ DecodeDateTime(char **field, int *ftype, int nf, tmask = DTK_M(SECOND); if (*cp == '.') { - double frac; - - frac = strtod(cp, &cp); - if (*cp != '\0') - return DTERR_BAD_FORMAT; -#ifdef HAVE_INT64_TIMESTAMP - *fsec = rint(frac * 1000000); -#else - *fsec = frac; -#endif + dterr = ParseFractionalSecond(cp, fsec); + if (dterr) + return dterr; tmask = DTK_ALL_SECS_M; } break; @@ -975,19 +1076,20 @@ DecodeDateTime(char **field, int *ftype, int nf, { double time; + errno = 0; time = strtod(cp, &cp); - if (*cp != '\0') + if (*cp != '\0' || errno != 0) return DTERR_BAD_FORMAT; - tmask |= DTK_TIME_M; #ifdef HAVE_INT64_TIMESTAMP - dt2time(time * USECS_PER_DAY, + time *= USECS_PER_DAY; +#else + time *= SECS_PER_DAY; +#endif + dt2time(time, &tm->tm_hour, &tm->tm_min, &tm->tm_sec, fsec); -#else - dt2time(time * SECS_PER_DAY, &tm->tm_hour, - &tm->tm_min, &tm->tm_sec, fsec); -#endif + tmask |= DTK_TIME_M; } break; @@ -1679,16 +1781,9 @@ DecodeTimeOnly(char **field, int *ftype, int nf, tmask = DTK_M(SECOND); if (*cp == '.') { - double frac; - - frac = strtod(cp, &cp); - if (*cp != '\0') - return DTERR_BAD_FORMAT; -#ifdef HAVE_INT64_TIMESTAMP - *fsec = rint(frac * 1000000); -#else - *fsec = frac; -#endif + dterr = ParseFractionalSecond(cp, fsec); + if (dterr) + return dterr; tmask = DTK_ALL_SECS_M; } break; @@ -1710,18 +1805,20 @@ DecodeTimeOnly(char **field, int *ftype, int nf, { double time; + errno = 0; time = strtod(cp, &cp); - if (*cp != '\0') + if (*cp != '\0' || errno != 0) return DTERR_BAD_FORMAT; - tmask |= DTK_TIME_M; #ifdef HAVE_INT64_TIMESTAMP - dt2time(time * USECS_PER_DAY, - &tm->tm_hour, &tm->tm_min, &tm->tm_sec, fsec); + time *= USECS_PER_DAY; #else - dt2time(time * SECS_PER_DAY, - &tm->tm_hour, &tm->tm_min, &tm->tm_sec, fsec); + time *= SECS_PER_DAY; #endif + dt2time(time, + &tm->tm_hour, &tm->tm_min, + &tm->tm_sec, fsec); + tmask |= DTK_TIME_M; } break; @@ -2231,6 +2328,7 @@ DecodeTime(char *str, int fmask, int range, int *tmask, struct pg_tm * tm, fsec_t *fsec) { char *cp; + int dterr; *tmask = DTK_TIME_M; @@ -2240,9 +2338,8 @@ DecodeTime(char *str, int fmask, int range, return DTERR_FIELD_OVERFLOW; if (*cp != ':') return DTERR_BAD_FORMAT; - str = cp + 1; errno = 0; - tm->tm_min = strtoi(str, &cp, 10); + tm->tm_min = strtoi(cp + 1, &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; if (*cp == '\0') @@ -2260,43 +2357,26 @@ DecodeTime(char *str, int fmask, int range, else if (*cp == '.') { /* always assume mm:ss.sss is MINUTE TO SECOND */ - double frac; - - str = cp; - frac = strtod(str, &cp); - if (*cp != '\0') - return DTERR_BAD_FORMAT; -#ifdef HAVE_INT64_TIMESTAMP - *fsec = rint(frac * 1000000); -#else - *fsec = frac; -#endif + dterr = ParseFractionalSecond(cp, fsec); + if (dterr) + return dterr; tm->tm_sec = tm->tm_min; tm->tm_min = tm->tm_hour; tm->tm_hour = 0; } else if (*cp == ':') { - str = cp + 1; errno = 0; - tm->tm_sec = strtoi(str, &cp, 10); + tm->tm_sec = strtoi(cp + 1, &cp, 10); if (errno == ERANGE) return DTERR_FIELD_OVERFLOW; if (*cp == '\0') *fsec = 0; else if (*cp == '.') { - double frac; - - str = cp; - frac = strtod(str, &cp); - if (*cp != '\0') - return DTERR_BAD_FORMAT; -#ifdef HAVE_INT64_TIMESTAMP - *fsec = rint(frac * 1000000); -#else - *fsec = frac; -#endif + dterr = ParseFractionalSecond(cp, fsec); + if (dterr) + return dterr; } else return DTERR_BAD_FORMAT; @@ -2343,8 +2423,6 @@ DecodeNumber(int flen, char *str, bool haveTextMonth, int fmask, if (*cp == '.') { - double frac; - /* * More than two digits before decimal point? Then could be a date or * a run-together time: 2001.360 20011225 040506.789 @@ -2360,14 +2438,9 @@ DecodeNumber(int flen, char *str, bool haveTextMonth, int fmask, return 0; } - frac = strtod(cp, &cp); - if (*cp != '\0') - return DTERR_BAD_FORMAT; -#ifdef HAVE_INT64_TIMESTAMP - *fsec = rint(frac * 1000000); -#else - *fsec = frac; -#endif + dterr = ParseFractionalSecond(cp, fsec); + if (dterr) + return dterr; } else if (*cp != '\0') return DTERR_BAD_FORMAT; @@ -2528,14 +2601,22 @@ DecodeNumberField(int len, char *str, int fmask, */ if ((cp = strchr(str, '.')) != NULL) { + /* + * Can we use ParseFractionalSecond here? Not clear whether + * trailing junk should be rejected ... + */ double frac; + errno = 0; frac = strtod(cp, NULL); + if (errno != 0) + return DTERR_BAD_FORMAT; #ifdef HAVE_INT64_TIMESTAMP *fsec = rint(frac * 1000000); #else *fsec = frac; #endif + /* Now truncate off the fraction for further processing */ *cp = '\0'; len = strlen(str); } @@ -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() * Interpret previously parsed fields for general time interval. * Returns 0 if successful, DTERR code if bogus input detected. @@ -2749,15 +2847,8 @@ DecodeInterval(char **field, int *ftype, int nf, int range, double fval; *dtype = DTK_DELTA; - type = IGNORE_DTF; - 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; + ClearPgTm(tm,fsec); /* read through list backwards to pick up units before values */ for (i = nf - 1; i >= 0; i--) @@ -2871,8 +2962,9 @@ DecodeInterval(char **field, int *ftype, int nf, int range, } else if (*cp == '.') { + errno = 0; fval = strtod(cp, &cp); - if (*cp != '\0') + if (*cp != '\0' || errno != 0) return DTERR_BAD_FORMAT; if (*field[i] == '-') @@ -2925,110 +3017,32 @@ DecodeInterval(char **field, int *ftype, int nf, int range, case DTK_MINUTE: tm->tm_min += val; - if (fval != 0) - { - 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 - } + AdjustFractSeconds(fval, tm, fsec, SECS_PER_MINUTE); tmask = DTK_M(MINUTE); break; case DTK_HOUR: tm->tm_hour += val; - if (fval != 0) - { - 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 - } + AdjustFractSeconds(fval, tm, fsec, SECS_PER_HOUR); tmask = DTK_M(HOUR); type = DTK_DAY; break; case DTK_DAY: tm->tm_mday += val; - 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 - } + AdjustFractSeconds(fval, tm, fsec, SECS_PER_DAY); tmask = (fmask & DTK_M(DAY)) ? 0 : DTK_M(DAY); break; case DTK_WEEK: tm->tm_mday += val * 7; - if (fval != 0) - { - 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 - } - } + AdjustFractDays(fval, tm, fsec, 7); tmask = (fmask & DTK_M(DAY)) ? 0 : DTK_M(DAY); break; case DTK_MONTH: tm->tm_mon += val; - if (fval != 0) - { - 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 - } - } + AdjustFractDays(fval, tm, fsec, DAYS_PER_MONTH); tmask = DTK_M(MONTH); break; @@ -3232,44 +3246,6 @@ ISO8601IntegerWidth(char *fieldstart) 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() * Decode an ISO 8601 time interval of the "format with designators" @@ -3296,14 +3272,7 @@ DecodeISO8601Interval(char *str, bool havefield = false; *dtype = DTK_DELTA; - - 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; + ClearPgTm(tm, fsec); if (strlen(str) < 2 || str[0] != 'P') return DTERR_BAD_FORMAT; @@ -3346,15 +3315,15 @@ DecodeISO8601Interval(char *str, break; case 'M': tm->tm_mon += val; - AdjustFractionalDays(fval, tm, fsec, DAYS_PER_MONTH); + AdjustFractDays(fval, tm, fsec, DAYS_PER_MONTH); break; case 'W': tm->tm_mday += val * 7; - AdjustFractionalDays(fval, tm, fsec, 7); + AdjustFractDays(fval, tm, fsec, 7); break; case 'D': tm->tm_mday += val; - AdjustFractionalSeconds(fval, tm, fsec, SECS_PER_DAY); + AdjustFractSeconds(fval, tm, fsec, SECS_PER_DAY); break; case 'T': /* ISO 8601 4.4.3.3 Alternative Format / Basic */ case '\0': @@ -3363,7 +3332,7 @@ DecodeISO8601Interval(char *str, tm->tm_year += val / 10000; tm->tm_mon += (val / 100) % 100; tm->tm_mday += val % 100; - AdjustFractionalSeconds(fval, tm, fsec, SECS_PER_DAY); + AdjustFractSeconds(fval, tm, fsec, SECS_PER_DAY); if (unit == '\0') return 0; datepart = false; @@ -3390,7 +3359,7 @@ DecodeISO8601Interval(char *str, if (dterr) return dterr; tm->tm_mon += val; - AdjustFractionalDays(fval, tm, fsec, DAYS_PER_MONTH); + AdjustFractDays(fval, tm, fsec, DAYS_PER_MONTH); if (*str == '\0') return 0; if (*str == 'T') @@ -3407,7 +3376,7 @@ DecodeISO8601Interval(char *str, if (dterr) return dterr; tm->tm_mday += val; - AdjustFractionalSeconds(fval, tm, fsec, SECS_PER_DAY); + AdjustFractSeconds(fval, tm, fsec, SECS_PER_DAY); if (*str == '\0') return 0; if (*str == 'T') @@ -3428,15 +3397,15 @@ DecodeISO8601Interval(char *str, { case 'H': tm->tm_hour += val; - AdjustFractionalSeconds(fval, tm, fsec, SECS_PER_HOUR); + AdjustFractSeconds(fval, tm, fsec, SECS_PER_HOUR); break; case 'M': tm->tm_min += val; - AdjustFractionalSeconds(fval, tm, fsec, SECS_PER_MINUTE); + AdjustFractSeconds(fval, tm, fsec, SECS_PER_MINUTE); break; case 'S': tm->tm_sec += val; - AdjustFractionalSeconds(fval, tm, fsec, 1); + AdjustFractSeconds(fval, tm, fsec, 1); break; case '\0': /* ISO 8601 4.4.3.3 Alternative Format */ if (ISO8601IntegerWidth(fieldstart) == 6 && !havefield) @@ -3444,7 +3413,7 @@ DecodeISO8601Interval(char *str, tm->tm_hour += val / 10000; tm->tm_min += (val / 100) % 100; tm->tm_sec += val % 100; - AdjustFractionalSeconds(fval, tm, fsec, 1); + AdjustFractSeconds(fval, tm, fsec, 1); return 0; } /* Else fall through to extended alternative format */ @@ -3453,7 +3422,7 @@ DecodeISO8601Interval(char *str, return DTERR_BAD_FORMAT; tm->tm_hour += val; - AdjustFractionalSeconds(fval, tm, fsec, SECS_PER_HOUR); + AdjustFractSeconds(fval, tm, fsec, SECS_PER_HOUR); if (unit == '\0') return 0; @@ -3461,7 +3430,7 @@ DecodeISO8601Interval(char *str, if (dterr) return dterr; tm->tm_min += val; - AdjustFractionalSeconds(fval, tm, fsec, SECS_PER_MINUTE); + AdjustFractSeconds(fval, tm, fsec, SECS_PER_MINUTE); if (*str == '\0') return 0; if (*str != ':') @@ -3472,7 +3441,7 @@ DecodeISO8601Interval(char *str, if (dterr) return dterr; tm->tm_sec += val; - AdjustFractionalSeconds(fval, tm, fsec, 1); + AdjustFractSeconds(fval, tm, fsec, 1); if (*str == '\0') return 0; return DTERR_BAD_FORMAT; @@ -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) 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); - /* - * 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); + AppendSeconds(str, tm->tm_sec, fsec, MAX_TIME_PRECISION, true); if (tzp != NULL) EncodeTimezone(str, *tzp, 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 */ 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_mon, tm->tm_mday, tm->tm_hour, tm->tm_min); 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_mon, tm->tm_mday, tm->tm_hour, tm->tm_min); - - /* - * 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); + AppendTimestampSeconds(str + strlen(str), tm, fsec); /* * 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, else 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_hour, tm->tm_min); - /* - * 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); + AppendTimestampSeconds(str + strlen(str), tm, fsec); 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, 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_hour, tm->tm_min); - /* - * 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); + AppendTimestampSeconds(str + strlen(str), tm, fsec); 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, else 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); - /* - * 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); + AppendTimestampSeconds(str + strlen(str), tm, fsec); sprintf(str + strlen(str), " %04d", (tm->tm_year > 0) ? tm->tm_year : -(tm->tm_year - 1)); @@ -3965,31 +3835,11 @@ EncodeDateTime(struct pg_tm * tm, fsec_t fsec, int *tzp, char **tzn, int style, /* * 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) -{ - if (fsec == 0) - { - sprintf(cp, fillzeros ? "%02d" : "%d", abs(sec)); - } - 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 an ISO-8601-style interval field, but only if value isn't zero */ static char * -AddISO8601IntervalPart(char *cp, int value, char units) +AddISO8601IntPart(char *cp, int value, char units) { if (value == 0) return cp; @@ -3997,6 +3847,48 @@ AddISO8601IntervalPart(char *cp, int value, char units) return cp + strlen(cp); } +/* Append a postgres-style interval field, but only if value isn't zero */ +static char * +AddPostgresIntPart(char *cp, int value, const char *units, + bool *is_zero, bool *is_before) +{ + if (value == 0) + return cp; + 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); +} + /* EncodeInterval() * Interpret time structure as a delta time and convert to string. @@ -4028,12 +3920,12 @@ EncodeInterval(struct pg_tm * tm, fsec_t fsec, int style, char *str) int min = tm->tm_min; int sec = tm->tm_sec; 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 * 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. */ switch (style) @@ -4084,14 +3976,15 @@ EncodeInterval(struct pg_tm * tm, fsec_t fsec, int style, char *str) */ char year_sign = (year < 0 || mon < 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:", year_sign, abs(year), abs(mon), day_sign, abs(mday), sec_sign, abs(hour), abs(min)); cp += strlen(cp); - AppendSeconds(cp, sec, fsec, true); + AppendSeconds(cp, sec, fsec, MAX_INTERVAL_PRECISION, true); } else if (has_year_month) { @@ -4101,13 +3994,13 @@ EncodeInterval(struct pg_tm * tm, fsec_t fsec, int style, char *str) { sprintf(cp, "%d %d:%02d:", mday, hour, min); cp += strlen(cp); - AppendSeconds(cp, sec, fsec, true); + AppendSeconds(cp, sec, fsec, MAX_INTERVAL_PRECISION, true); } else { sprintf(cp, "%d:%02d:", hour, min); cp += strlen(cp); - AppendSeconds(cp, sec, fsec, true); + AppendSeconds(cp, sec, fsec, MAX_INTERVAL_PRECISION, true); } } break; @@ -4122,18 +4015,18 @@ EncodeInterval(struct pg_tm * tm, fsec_t fsec, int style, char *str) break; } *cp++ = 'P'; - cp = AddISO8601IntervalPart(cp, year, 'Y'); - cp = AddISO8601IntervalPart(cp, mon , 'M'); - cp = AddISO8601IntervalPart(cp, mday, 'D'); + cp = AddISO8601IntPart(cp, year, 'Y'); + cp = AddISO8601IntPart(cp, mon , 'M'); + cp = AddISO8601IntPart(cp, mday, 'D'); if (hour != 0 || min != 0 || sec != 0 || fsec != 0) *cp++ = 'T'; - cp = AddISO8601IntervalPart(cp, hour, 'H'); - cp = AddISO8601IntervalPart(cp, min , 'M'); + cp = AddISO8601IntPart(cp, hour, 'H'); + cp = AddISO8601IntPart(cp, min , 'M'); if (sec != 0 || fsec != 0) { if (sec < 0 || fsec < 0) *cp++ = '-'; - AppendSeconds(cp, sec, fsec, false); + AppendSeconds(cp, sec, fsec, MAX_INTERVAL_PRECISION, false); cp += strlen(cp); *cp++ = 'S'; *cp++ = '\0'; @@ -4142,196 +4035,55 @@ EncodeInterval(struct pg_tm * tm, fsec_t fsec, int style, char *str) /* Compatible with postgresql < 8.4 when DateStyle = 'iso' */ 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); + cp = AddPostgresIntPart(cp, mday, "day", &is_zero, &is_before); + if (is_zero || hour != 0 || min != 0 || sec != 0 || fsec != 0) { - sprintf(cp, "%d year%s", - tm->tm_year, (tm->tm_year != 1) ? "s" : ""); - cp += strlen(cp); - is_before = (tm->tm_year < 0); - is_nonzero = TRUE; - } + bool minus = (hour < 0 || min < 0 || sec < 0 || fsec < 0); - 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 || - 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 ? "+" : "")), - abs(tm->tm_hour), abs(tm->tm_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"); + abs(hour), abs(min)); cp += strlen(cp); + AppendSeconds(cp, sec, fsec, MAX_INTERVAL_PRECISION, true); } break; /* Compatible with postgresql < 8.4 when DateStyle != 'iso' */ case INTSTYLE_POSTGRES_VERBOSE: default: - strcpy(cp, "@ "); - cp += strlen(cp); - - if (tm->tm_year != 0) + strcpy(cp, "@"); + cp++; + cp = AddVerboseIntPart(cp, year, "year", &is_zero, &is_before); + cp = AddVerboseIntPart(cp, mon, "mon", &is_zero, &is_before); + cp = AddVerboseIntPart(cp, mday, "day", &is_zero, &is_before); + cp = AddVerboseIntPart(cp, hour, "hour", &is_zero, &is_before); + cp = AddVerboseIntPart(cp, min, "min", &is_zero, &is_before); + if (sec != 0 || fsec != 0) { - int year = tm->tm_year; - - if (tm->tm_year < 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; - -#ifdef HAVE_INT64_TIMESTAMP - sec = fsec; - if (is_before || (!is_nonzero && tm->tm_sec < 0)) + *cp++ = ' '; + if (sec < 0 || (sec == 0 && fsec < 0)) { - tm->tm_sec = -tm->tm_sec; - sec = -sec; - is_before = TRUE; + if (is_zero) + is_before = TRUE; + else if (!is_before) + *cp++ = '-'; } - else if (!is_nonzero && tm->tm_sec == 0 && fsec < 0) - { - sec = -sec; - is_before = TRUE; - } - sprintf(cp, "%s%d.%02d secs", is_nonzero ? " " : "", - tm->tm_sec, abs((int) rint(sec / 10000.0))); + else if (is_before) + *cp++ = '-'; + AppendSeconds(cp, sec, fsec, MAX_INTERVAL_PRECISION, false); cp += strlen(cp); -#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); - if (!is_nonzero) - is_before = (tm->tm_sec < 0); - is_nonzero = TRUE; + sprintf(cp, " sec%s", + (abs(sec) != 1 || fsec != 0) ? "s" : ""); + is_zero = FALSE; } /* identically zero? then put in a unitless zero... */ - if (!is_nonzero) - { - strcat(cp, "0"); - cp += strlen(cp); - } + if (is_zero) + strcat(cp, " 0"); if (is_before) - { strcat(cp, " ago"); - cp += strlen(cp); - } break; } diff --git a/src/test/regress/expected/horology.out b/src/test/regress/expected/horology.out index 926d8f4458..9c70c80eb9 100644 --- a/src/test/regress/expected/horology.out +++ b/src/test/regress/expected/horology.out @@ -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:02 1998 - | Tue Feb 10 17:32:01.40 1998 - | Tue Feb 10 17:32:01.50 1998 - | Tue Feb 10 17:32:01.60 1998 + | Tue Feb 10 17:32:01.4 1998 + | Tue Feb 10 17:32:01.5 1998 + | Tue Feb 10 17:32:01.6 1998 | Fri Jan 02 00:00:00 1998 | Fri Jan 02 03:04:05 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; | 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:01.40 1996 - | Sat Feb 10 17:32:01.50 1996 - | Sat Feb 10 17:32:01.60 1996 + | Sat Feb 10 17:32:01.4 1996 + | Sat Feb 10 17:32:01.5 1996 + | Sat Feb 10 17:32:01.6 1996 | Tue Jan 02 00:00:00 1996 | Tue Jan 02 03:04:05 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; | 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:01.40 1998 PST - | Tue Feb 10 17:32:01.50 1998 PST - | Tue Feb 10 17:32:01.60 1998 PST + | Tue Feb 10 17:32:01.4 1998 PST + | Tue Feb 10 17:32:01.5 1998 PST + | Tue Feb 10 17:32:01.6 1998 PST | Fri Jan 02 00:00:00 1998 PST | Fri Jan 02 03:04:05 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; | 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:01.40 1996 PST - | Sat Feb 10 17:32:01.50 1996 PST - | Sat Feb 10 17:32:01.60 1996 PST + | Sat Feb 10 17:32:01.4 1996 PST + | Sat Feb 10 17:32:01.5 1996 PST + | Sat Feb 10 17:32:01.6 1996 PST | Tue Jan 02 00:00:00 1996 PST | Tue Jan 02 03:04:05 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" WHERE t.d1 BETWEEN '1990-01-01' AND '2001-01-01' AND i.f1 BETWEEN '00:00' AND '23:00' ORDER BY 1,2; - 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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.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.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.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.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.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: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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 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 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 - 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 - 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 - 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 - 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 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 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 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 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 - 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 + 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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.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.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.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.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.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.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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 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 | @ 5 hours | Sun Dec 31 22:32:01 2000 | Sun Dec 31 12:32:01 2000 (104 rows) 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; | 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:01.40 1997 - | Mon Feb 10 17:32:01.50 1997 - | Mon Feb 10 17:32:01.60 1997 + | Mon Feb 10 17:32:01.4 1997 + | Mon Feb 10 17:32:01.5 1997 + | Mon Feb 10 17:32:01.6 1997 | Thu Jan 02 00:00:00 1997 | Thu Jan 02 03:04:05 1997 | Mon Feb 10 17:32:01 1997 @@ -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:02 - | 1997-02-10 17:32:01.40 - | 1997-02-10 17:32:01.50 - | 1997-02-10 17:32:01.60 + | 1997-02-10 17:32:01.4 + | 1997-02-10 17:32:01.5 + | 1997-02-10 17:32:01.6 | 1997-01-02 00:00:00 | 1997-01-02 03:04:05 | 1997-02-10 17:32:01 @@ -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:02 - | 02/10/1997 17:32:01.40 - | 02/10/1997 17:32:01.50 - | 02/10/1997 17:32:01.60 + | 02/10/1997 17:32:01.4 + | 02/10/1997 17:32:01.5 + | 02/10/1997 17:32:01.6 | 01/02/1997 00:00:00 | 01/02/1997 03:04:05 | 02/10/1997 17:32:01 @@ -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:02 1997 - | Mon 10 Feb 17:32:01.40 1997 - | Mon 10 Feb 17:32:01.50 1997 - | Mon 10 Feb 17:32:01.60 1997 + | Mon 10 Feb 17:32:01.4 1997 + | Mon 10 Feb 17:32:01.5 1997 + | Mon 10 Feb 17:32:01.6 1997 | Thu 02 Jan 00:00:00 1997 | Thu 02 Jan 03:04:05 1997 | Mon 10 Feb 17:32:01 1997 @@ -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:02 - | 1997-02-10 17:32:01.40 - | 1997-02-10 17:32:01.50 - | 1997-02-10 17:32:01.60 + | 1997-02-10 17:32:01.4 + | 1997-02-10 17:32:01.5 + | 1997-02-10 17:32:01.6 | 1997-01-02 00:00:00 | 1997-01-02 03:04:05 | 1997-02-10 17:32:01 @@ -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:02 - | 10/02/1997 17:32:01.40 - | 10/02/1997 17:32:01.50 - | 10/02/1997 17:32:01.60 + | 10/02/1997 17:32:01.4 + | 10/02/1997 17:32:01.5 + | 10/02/1997 17:32:01.6 | 02/01/1997 00:00:00 | 02/01/1997 03:04:05 | 10/02/1997 17:32:01 diff --git a/src/test/regress/expected/interval.out b/src/test/regress/expected/interval.out index 94a4275404..f788e369e7 100644 --- a/src/test/regress/expected/interval.out +++ b/src/test/regress/expected/interval.out @@ -223,7 +223,7 @@ FROM INTERVAL_MULDIV_TBL; 1 year 12 days 122:24:00 -1 years -12 days +93:36: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 1 mon 6 days 4 mons 6 days @@ -237,7 +237,7 @@ FROM INTERVAL_MULDIV_TBL; 28 years 104 days 2961:36:00 -28 years -104 days +2942:24: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 2 years 8 mons 24 days 9 years 6 mons 24 days @@ -251,7 +251,7 @@ FROM INTERVAL_MULDIV_TBL; 4 mons 4 days 40:48:00 -4 mons -4 days +31:12: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 12 days 1 mon 12 days @@ -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 "mixed sign", (- 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 -------+-----------------+------------------+--------------------+-------------------+-----------------------+--------------------- - PT0S | P1Y2M | P1DT2H3M4S | PT2H3M4.45679S | P1Y2M3DT4H5M6.70S | P1Y2M-3DT-4H-5M-6.70S | P-1Y-2M3DT4H5M6.70S + 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.7S | P1Y2M-3DT-4H-5M-6.7S | P-1Y-2M3DT4H5M6.7S (1 row) -- test inputting ISO 8601 4.4.2.1 "Format With Time Unit Designators" @@ -669,9 +669,9 @@ select interval 'P0Y' AS "zero", interval 'P1Y2M3DT4H5M6.7S' AS "all fields", interval 'P-1Y-2M-3DT-4H-5M-6.7S' AS "negative", interval 'PT-0.1S' AS "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 + 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.7 | -1-2 -3 -4:05:06.7 | -0:00:00.1 (1 row) -- test inputting ISO 8601 4.4.2.2 "Alternative Format" @@ -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 (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) + diff --git a/src/test/regress/expected/timestamp.out b/src/test/regress/expected/timestamp.out index 3f5a0677f5..7646f1aee2 100644 --- a/src/test/regress/expected/timestamp.out +++ b/src/test/regress/expected/timestamp.out @@ -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:02 1997 - | Mon Feb 10 17:32:01.40 1997 - | Mon Feb 10 17:32:01.50 1997 - | Mon Feb 10 17:32:01.60 1997 + | Mon Feb 10 17:32:01.4 1997 + | Mon Feb 10 17:32:01.5 1997 + | Mon Feb 10 17:32:01.6 1997 | Thu Jan 02 00:00:00 1997 | Thu Jan 02 03:04:05 1997 | Mon Feb 10 17:32:01 1997 @@ -257,15 +257,15 @@ SELECT '' AS "64", d1 FROM TIMESTAMP_TBL; -- Demonstrate functions and operators SELECT '' AS "48", d1 FROM TIMESTAMP_TBL WHERE d1 > timestamp without time zone '1997-01-02'; - 48 | d1 -----+----------------------------- + 48 | d1 +----+---------------------------- | infinity | 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:01.40 1997 - | Mon Feb 10 17:32:01.50 1997 - | Mon Feb 10 17:32:01.60 1997 + | Mon Feb 10 17:32:01.4 1997 + | Mon Feb 10 17:32:01.5 1997 + | Mon Feb 10 17:32:01.6 1997 | Thu Jan 02 03:04:05 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 | 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:01.40 1997 - | Mon Feb 10 17:32:01.50 1997 - | Mon Feb 10 17:32:01.60 1997 + | Mon Feb 10 17:32:01.4 1997 + | Mon Feb 10 17:32:01.5 1997 + | Mon Feb 10 17:32:01.6 1997 | Thu Jan 02 03:04:05 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 SELECT '' AS "49", d1 FROM TIMESTAMP_TBL WHERE d1 >= timestamp without time zone '1997-01-02'; - 49 | d1 -----+----------------------------- + 49 | d1 +----+---------------------------- | infinity | 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:01.40 1997 - | Mon Feb 10 17:32:01.50 1997 - | Mon Feb 10 17:32:01.60 1997 + | Mon Feb 10 17:32:01.4 1997 + | Mon Feb 10 17:32:01.5 1997 + | Mon Feb 10 17:32:01.6 1997 | Thu Jan 02 00:00:00 1997 | Thu Jan 02 03:04:05 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 | @ 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 1.40 secs - | @ 39 days 17 hours 32 mins 1.50 secs - | @ 39 days 17 hours 32 mins 1.60 secs + | @ 39 days 17 hours 32 mins 1.4 secs + | @ 39 days 17 hours 32 mins 1.5 secs + | @ 39 days 17 hours 32 mins 1.6 secs | @ 0 | @ 3 hours 4 mins 5 secs | @ 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 | @ 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 1.40 secs - | @ 39 days 17 hours 32 mins 1.50 secs - | @ 39 days 17 hours 32 mins 1.60 secs + | @ 39 days 17 hours 32 mins 1.4 secs + | @ 39 days 17 hours 32 mins 1.5 secs + | @ 39 days 17 hours 32 mins 1.6 secs | @ 0 | @ 3 hours 4 mins 5 secs | @ 39 days 17 hours 32 mins 1 sec @@ -622,189 +622,189 @@ SELECT '' AS "54", d1 as "timestamp", date_part( 'day', d1) AS day, date_part( 'hour', d1) AS hour, 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'; - 54 | timestamp | year | month | day | hour | minute | second -----+-----------------------------+------+-------+-----+------+--------+-------- - | 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: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.50 1997 | 1997 | 2 | 10 | 17 | 32 | 1.5 - | Mon Feb 10 17:32:01.60 1997 | 1997 | 2 | 10 | 17 | 32 | 1.6 - | 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 - | 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 - | 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 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 03:14:04 2000 | 2000 | 3 | 15 | 3 | 14 | 4 - | 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: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 - | 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 - | 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 - | 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 - | 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 - | 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 - | 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 - | 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 - | 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 - | 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 - | 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 - | 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 + 54 | timestamp | year | month | day | hour | minute | second +----+----------------------------+------+-------+-----+------+--------+-------- + | 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:02 1997 | 1997 | 2 | 10 | 17 | 32 | 2 + | Mon Feb 10 17:32:01.4 1997 | 1997 | 2 | 10 | 17 | 32 | 1.4 + | Mon Feb 10 17:32:01.5 1997 | 1997 | 2 | 10 | 17 | 32 | 1.5 + | 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 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 + | 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 + | 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 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 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: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 + | 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 + | 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 + | 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 + | 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 + | 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 + | 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 + | 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 + | 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 + | 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 + | 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 + | 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 (55 rows) SELECT '' AS "54", d1 as "timestamp", date_part( 'quarter', d1) AS quarter, date_part( 'msec', d1) AS msec, date_part( 'usec', d1) AS usec FROM TIMESTAMP_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01'; - 54 | timestamp | quarter | msec | usec -----+-----------------------------+---------+-------+---------- - | 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:02 1997 | 1 | 2000 | 2000000 - | Mon Feb 10 17:32:01.40 1997 | 1 | 1400 | 1400000 - | Mon Feb 10 17:32:01.50 1997 | 1 | 1500 | 1500000 - | Mon Feb 10 17:32:01.60 1997 | 1 | 1600 | 1600000 - | Thu Jan 02 00:00:00 1997 | 1 | 0 | 0 - | 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 - | Tue Jun 10 17:32:01 1997 | 2 | 1000 | 1000000 - | Sat Sep 22 18:19:20 2001 | 3 | 20000 | 20000000 - | Wed Mar 15 08:14:01 2000 | 1 | 1000 | 1000000 - | Wed Mar 15 13:14:02 2000 | 1 | 2000 | 2000000 - | Wed Mar 15 12:14:03 2000 | 1 | 3000 | 3000000 - | Wed Mar 15 03:14:04 2000 | 1 | 4000 | 4000000 - | 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: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 - | Tue Jun 10 18:32:01 1997 | 2 | 1000 | 1000000 - | Mon Feb 10 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 - | Thu Feb 13 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 - | 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 - | Thu Feb 29 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 - | Tue Dec 31 17:32:01 1996 | 4 | 1000 | 1000000 - | Wed Jan 01 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 - | Tue Dec 30 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 - | Sat Jan 01 17:32:01 2000 | 1 | 1000 | 1000000 - | Sun Dec 31 17:32:01 2000 | 4 | 1000 | 1000000 - | Mon Jan 01 17:32:01 2001 | 1 | 1000 | 1000000 + 54 | timestamp | quarter | msec | usec +----+----------------------------+---------+-------+---------- + | 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:02 1997 | 1 | 2000 | 2000000 + | Mon Feb 10 17:32:01.4 1997 | 1 | 1400 | 1400000 + | Mon Feb 10 17:32:01.5 1997 | 1 | 1500 | 1500000 + | Mon Feb 10 17:32:01.6 1997 | 1 | 1600 | 1600000 + | Thu Jan 02 00:00:00 1997 | 1 | 0 | 0 + | 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 + | Tue Jun 10 17:32:01 1997 | 2 | 1000 | 1000000 + | Sat Sep 22 18:19:20 2001 | 3 | 20000 | 20000000 + | Wed Mar 15 08:14:01 2000 | 1 | 1000 | 1000000 + | Wed Mar 15 13:14:02 2000 | 1 | 2000 | 2000000 + | Wed Mar 15 12:14:03 2000 | 1 | 3000 | 3000000 + | Wed Mar 15 03:14:04 2000 | 1 | 4000 | 4000000 + | 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: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 + | Tue Jun 10 18:32:01 1997 | 2 | 1000 | 1000000 + | Mon Feb 10 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 + | Thu Feb 13 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 + | 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 + | Thu Feb 29 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 + | Tue Dec 31 17:32:01 1996 | 4 | 1000 | 1000000 + | Wed Jan 01 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 + | Tue Dec 30 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 + | Sat Jan 01 17:32:01 2000 | 1 | 1000 | 1000000 + | Sun Dec 31 17:32:01 2000 | 4 | 1000 | 1000000 + | Mon Jan 01 17:32:01 2001 | 1 | 1000 | 1000000 (55 rows) SELECT '' AS "54", d1 as "timestamp", date_part( 'isoyear', d1) AS isoyear, date_part( 'week', d1) AS week, date_part( 'dow', d1) AS dow FROM TIMESTAMP_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01'; - 54 | timestamp | isoyear | week | dow -----+-----------------------------+---------+------+----- - | 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:02 1997 | 1997 | 7 | 1 - | Mon Feb 10 17:32:01.40 1997 | 1997 | 7 | 1 - | Mon Feb 10 17:32:01.50 1997 | 1997 | 7 | 1 - | Mon Feb 10 17:32:01.60 1997 | 1997 | 7 | 1 - | Thu Jan 02 00:00:00 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 - | Tue Jun 10 17:32:01 1997 | 1997 | 24 | 2 - | Sat Sep 22 18:19:20 2001 | 2001 | 38 | 6 - | Wed Mar 15 08:14:01 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 03:14:04 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: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 - | Tue Jun 10 18:32:01 1997 | 1997 | 24 | 2 - | Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 - | Tue Feb 11 17:32:01 1997 | 1997 | 7 | 2 - | Wed Feb 12 17:32:01 1997 | 1997 | 7 | 3 - | Thu Feb 13 17:32:01 1997 | 1997 | 7 | 4 - | Fri Feb 14 17:32:01 1997 | 1997 | 7 | 5 - | 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 - | Wed Feb 28 17:32:01 1996 | 1996 | 9 | 3 - | Thu Feb 29 17:32:01 1996 | 1996 | 9 | 4 - | Fri Mar 01 17:32:01 1996 | 1996 | 9 | 5 - | Mon Dec 30 17:32:01 1996 | 1997 | 1 | 1 - | Tue Dec 31 17:32:01 1996 | 1997 | 1 | 2 - | Wed Jan 01 17:32:01 1997 | 1997 | 1 | 3 - | Fri Feb 28 17:32:01 1997 | 1997 | 9 | 5 - | Sat Mar 01 17:32:01 1997 | 1997 | 9 | 6 - | Tue Dec 30 17:32:01 1997 | 1998 | 1 | 2 - | Wed Dec 31 17:32:01 1997 | 1998 | 1 | 3 - | Fri Dec 31 17:32:01 1999 | 1999 | 52 | 5 - | Sat Jan 01 17:32:01 2000 | 1999 | 52 | 6 - | Sun Dec 31 17:32:01 2000 | 2000 | 52 | 0 - | Mon Jan 01 17:32:01 2001 | 2001 | 1 | 1 + 54 | timestamp | isoyear | week | dow +----+----------------------------+---------+------+----- + | 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:02 1997 | 1997 | 7 | 1 + | Mon Feb 10 17:32:01.4 1997 | 1997 | 7 | 1 + | Mon Feb 10 17:32:01.5 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 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 + | Tue Jun 10 17:32:01 1997 | 1997 | 24 | 2 + | Sat Sep 22 18:19:20 2001 | 2001 | 38 | 6 + | Wed Mar 15 08:14:01 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 03:14:04 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: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 + | Tue Jun 10 18:32:01 1997 | 1997 | 24 | 2 + | Mon Feb 10 17:32:01 1997 | 1997 | 7 | 1 + | Tue Feb 11 17:32:01 1997 | 1997 | 7 | 2 + | Wed Feb 12 17:32:01 1997 | 1997 | 7 | 3 + | Thu Feb 13 17:32:01 1997 | 1997 | 7 | 4 + | Fri Feb 14 17:32:01 1997 | 1997 | 7 | 5 + | 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 + | Wed Feb 28 17:32:01 1996 | 1996 | 9 | 3 + | Thu Feb 29 17:32:01 1996 | 1996 | 9 | 4 + | Fri Mar 01 17:32:01 1996 | 1996 | 9 | 5 + | Mon Dec 30 17:32:01 1996 | 1997 | 1 | 1 + | Tue Dec 31 17:32:01 1996 | 1997 | 1 | 2 + | Wed Jan 01 17:32:01 1997 | 1997 | 1 | 3 + | Fri Feb 28 17:32:01 1997 | 1997 | 9 | 5 + | Sat Mar 01 17:32:01 1997 | 1997 | 9 | 6 + | Tue Dec 30 17:32:01 1997 | 1998 | 1 | 2 + | Wed Dec 31 17:32:01 1997 | 1998 | 1 | 3 + | Fri Dec 31 17:32:01 1999 | 1999 | 52 | 5 + | Sat Jan 01 17:32:01 2000 | 1999 | 52 | 6 + | Sun Dec 31 17:32:01 2000 | 2000 | 52 | 0 + | Mon Jan 01 17:32:01 2001 | 2001 | 1 | 1 (55 rows) -- TO_CHAR() diff --git a/src/test/regress/expected/timestamptz.out b/src/test/regress/expected/timestamptz.out index 5849d8f02e..7b12a2c2c8 100644 --- a/src/test/regress/expected/timestamptz.out +++ b/src/test/regress/expected/timestamptz.out @@ -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:02 1997 PST - | Mon Feb 10 17:32:01.40 1997 PST - | Mon Feb 10 17:32:01.50 1997 PST - | Mon Feb 10 17:32:01.60 1997 PST + | Mon Feb 10 17:32:01.4 1997 PST + | Mon Feb 10 17:32:01.5 1997 PST + | Mon Feb 10 17:32:01.6 1997 PST | Thu Jan 02 00:00:00 1997 PST | Thu Jan 02 03:04:05 1997 PST | Mon Feb 10 17:32:01 1997 PST @@ -329,15 +329,15 @@ SELECT '' AS "64", d1 FROM TIMESTAMPTZ_TBL; -- Demonstrate functions and operators SELECT '' AS "48", d1 FROM TIMESTAMPTZ_TBL WHERE d1 > timestamp with time zone '1997-01-02'; - 48 | d1 -----+--------------------------------- + 48 | d1 +----+-------------------------------- | infinity | 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:01.40 1997 PST - | Mon Feb 10 17:32:01.50 1997 PST - | Mon Feb 10 17:32:01.60 1997 PST + | Mon Feb 10 17:32:01.4 1997 PST + | Mon Feb 10 17:32:01.5 1997 PST + | Mon Feb 10 17:32:01.6 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 @@ -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:02 1997 PST - | Mon Feb 10 17:32:01.40 1997 PST - | Mon Feb 10 17:32:01.50 1997 PST - | Mon Feb 10 17:32:01.60 1997 PST + | Mon Feb 10 17:32:01.4 1997 PST + | Mon Feb 10 17:32:01.5 1997 PST + | Mon Feb 10 17:32:01.6 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 @@ -506,15 +506,15 @@ SELECT '' AS "16", d1 FROM TIMESTAMPTZ_TBL SELECT '' AS "49", d1 FROM TIMESTAMPTZ_TBL WHERE d1 >= timestamp with time zone '1997-01-02'; - 49 | d1 -----+--------------------------------- + 49 | d1 +----+-------------------------------- | infinity | 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:01.40 1997 PST - | Mon Feb 10 17:32:01.50 1997 PST - | Mon Feb 10 17:32:01.60 1997 PST + | Mon Feb 10 17:32:01.4 1997 PST + | Mon Feb 10 17:32:01.5 1997 PST + | Mon Feb 10 17:32:01.6 1997 PST | Thu Jan 02 00:00:00 1997 PST | Thu Jan 02 03:04:05 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 | @ 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 1.40 secs - | @ 39 days 17 hours 32 mins 1.50 secs - | @ 39 days 17 hours 32 mins 1.60 secs + | @ 39 days 17 hours 32 mins 1.4 secs + | @ 39 days 17 hours 32 mins 1.5 secs + | @ 39 days 17 hours 32 mins 1.6 secs | @ 0 | @ 3 hours 4 mins 5 secs | @ 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 | @ 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 1.40 secs - | @ 39 days 17 hours 32 mins 1.50 secs - | @ 39 days 17 hours 32 mins 1.60 secs + | @ 39 days 17 hours 32 mins 1.4 secs + | @ 39 days 17 hours 32 mins 1.5 secs + | @ 39 days 17 hours 32 mins 1.6 secs | @ 0 | @ 3 hours 4 mins 5 secs | @ 39 days 17 hours 32 mins 1 sec @@ -698,192 +698,192 @@ SELECT '' AS "54", d1 as timestamptz, date_part( 'day', d1) AS day, date_part( 'hour', d1) AS hour, 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'; - 54 | timestamptz | year | month | day | hour | minute | second -----+---------------------------------+------+-------+-----+------+--------+-------- - | 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: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.50 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 - | 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 - | 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 - | 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 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 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 - | 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: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 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 - | 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 - | 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 - | 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 - | 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 - | 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 - | 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 - | 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 - | 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 - | 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 - | 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 - | 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 + 54 | timestamptz | year | month | day | hour | minute | second +----+--------------------------------+------+-------+-----+------+--------+-------- + | 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:02 1997 PST | 1997 | 2 | 10 | 17 | 32 | 2 + | Mon Feb 10 17:32:01.4 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1.4 + | Mon Feb 10 17:32:01.5 1997 PST | 1997 | 2 | 10 | 17 | 32 | 1.5 + | 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 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 + | 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 + | 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 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 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: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 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 + | 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 + | 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 + | 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 + | 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 + | 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 + | 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 + | 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 + | 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 + | 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 + | 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 + | 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 + | Mon Jan 01 17:32:01 2001 PST | 2001 | 1 | 1 | 17 | 32 | 1 (56 rows) SELECT '' AS "54", d1 as timestamptz, date_part( 'quarter', d1) AS quarter, date_part( 'msec', d1) AS msec, date_part( 'usec', d1) AS usec FROM TIMESTAMPTZ_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01'; - 54 | timestamptz | quarter | msec | usec -----+---------------------------------+---------+-------+---------- - | 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:02 1997 PST | 1 | 2000 | 2000000 - | Mon Feb 10 17:32:01.40 1997 PST | 1 | 1400 | 1400000 - | Mon Feb 10 17:32:01.50 1997 PST | 1 | 1500 | 1500000 - | Mon Feb 10 17:32:01.60 1997 PST | 1 | 1600 | 1600000 - | Thu Jan 02 00:00:00 1997 PST | 1 | 0 | 0 - | 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 - | Tue Jun 10 17:32:01 1997 PDT | 2 | 1000 | 1000000 - | 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 04:14:02 2000 PST | 1 | 2000 | 2000000 - | 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 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: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 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 - | Thu Jul 10 14:32:01 1997 PDT | 3 | 1000 | 1000000 - | Tue Jun 10 18:32:01 1997 PDT | 2 | 1000 | 1000000 - | Mon Feb 10 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 - | Thu Feb 13 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 - | 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 - | Thu Feb 29 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 - | Tue Dec 31 17:32:01 1996 PST | 4 | 1000 | 1000000 - | Wed Jan 01 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 - | Tue Dec 30 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 - | Sat Jan 01 17:32:01 2000 PST | 1 | 1000 | 1000000 - | Sun Dec 31 17:32:01 2000 PST | 4 | 1000 | 1000000 - | Mon Jan 01 17:32:01 2001 PST | 1 | 1000 | 1000000 + 54 | timestamptz | quarter | msec | usec +----+--------------------------------+---------+-------+---------- + | 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:02 1997 PST | 1 | 2000 | 2000000 + | Mon Feb 10 17:32:01.4 1997 PST | 1 | 1400 | 1400000 + | Mon Feb 10 17:32:01.5 1997 PST | 1 | 1500 | 1500000 + | 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 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 + | Tue Jun 10 17:32:01 1997 PDT | 2 | 1000 | 1000000 + | 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 04:14:02 2000 PST | 1 | 2000 | 2000000 + | 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 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: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 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 + | Thu Jul 10 14:32:01 1997 PDT | 3 | 1000 | 1000000 + | Tue Jun 10 18:32:01 1997 PDT | 2 | 1000 | 1000000 + | Mon Feb 10 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 + | Thu Feb 13 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 + | 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 + | Thu Feb 29 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 + | Tue Dec 31 17:32:01 1996 PST | 4 | 1000 | 1000000 + | Wed Jan 01 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 + | Tue Dec 30 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 + | Sat Jan 01 17:32:01 2000 PST | 1 | 1000 | 1000000 + | Sun Dec 31 17:32:01 2000 PST | 4 | 1000 | 1000000 + | Mon Jan 01 17:32:01 2001 PST | 1 | 1000 | 1000000 (56 rows) SELECT '' AS "54", d1 as timestamptz, date_part( 'isoyear', d1) AS isoyear, date_part( 'week', d1) AS week, date_part( 'dow', d1) AS dow FROM TIMESTAMPTZ_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01'; - 54 | timestamptz | isoyear | week | dow -----+---------------------------------+---------+------+----- - | 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:02 1997 PST | 1997 | 7 | 1 - | Mon Feb 10 17:32:01.40 1997 PST | 1997 | 7 | 1 - | Mon Feb 10 17:32:01.50 1997 PST | 1997 | 7 | 1 - | Mon Feb 10 17:32:01.60 1997 PST | 1997 | 7 | 1 - | Thu Jan 02 00:00:00 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 - | Tue Jun 10 17:32:01 1997 PDT | 1997 | 24 | 2 - | 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 04:14:02 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 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: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 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 - | Thu Jul 10 14:32:01 1997 PDT | 1997 | 28 | 4 - | Tue Jun 10 18:32:01 1997 PDT | 1997 | 24 | 2 - | Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 - | Tue Feb 11 17:32:01 1997 PST | 1997 | 7 | 2 - | Wed Feb 12 17:32:01 1997 PST | 1997 | 7 | 3 - | Thu Feb 13 17:32:01 1997 PST | 1997 | 7 | 4 - | Fri Feb 14 17:32:01 1997 PST | 1997 | 7 | 5 - | 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 - | Wed Feb 28 17:32:01 1996 PST | 1996 | 9 | 3 - | Thu Feb 29 17:32:01 1996 PST | 1996 | 9 | 4 - | Fri Mar 01 17:32:01 1996 PST | 1996 | 9 | 5 - | Mon Dec 30 17:32:01 1996 PST | 1997 | 1 | 1 - | Tue Dec 31 17:32:01 1996 PST | 1997 | 1 | 2 - | Wed Jan 01 17:32:01 1997 PST | 1997 | 1 | 3 - | Fri Feb 28 17:32:01 1997 PST | 1997 | 9 | 5 - | Sat Mar 01 17:32:01 1997 PST | 1997 | 9 | 6 - | Tue Dec 30 17:32:01 1997 PST | 1998 | 1 | 2 - | Wed Dec 31 17:32:01 1997 PST | 1998 | 1 | 3 - | Fri Dec 31 17:32:01 1999 PST | 1999 | 52 | 5 - | Sat Jan 01 17:32:01 2000 PST | 1999 | 52 | 6 - | Sun Dec 31 17:32:01 2000 PST | 2000 | 52 | 0 - | Mon Jan 01 17:32:01 2001 PST | 2001 | 1 | 1 + 54 | timestamptz | isoyear | week | dow +----+--------------------------------+---------+------+----- + | 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:02 1997 PST | 1997 | 7 | 1 + | Mon Feb 10 17:32:01.4 1997 PST | 1997 | 7 | 1 + | Mon Feb 10 17:32:01.5 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 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 + | Tue Jun 10 17:32:01 1997 PDT | 1997 | 24 | 2 + | 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 04:14:02 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 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: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 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 + | Thu Jul 10 14:32:01 1997 PDT | 1997 | 28 | 4 + | Tue Jun 10 18:32:01 1997 PDT | 1997 | 24 | 2 + | Mon Feb 10 17:32:01 1997 PST | 1997 | 7 | 1 + | Tue Feb 11 17:32:01 1997 PST | 1997 | 7 | 2 + | Wed Feb 12 17:32:01 1997 PST | 1997 | 7 | 3 + | Thu Feb 13 17:32:01 1997 PST | 1997 | 7 | 4 + | Fri Feb 14 17:32:01 1997 PST | 1997 | 7 | 5 + | 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 + | Wed Feb 28 17:32:01 1996 PST | 1996 | 9 | 3 + | Thu Feb 29 17:32:01 1996 PST | 1996 | 9 | 4 + | Fri Mar 01 17:32:01 1996 PST | 1996 | 9 | 5 + | Mon Dec 30 17:32:01 1996 PST | 1997 | 1 | 1 + | Tue Dec 31 17:32:01 1996 PST | 1997 | 1 | 2 + | Wed Jan 01 17:32:01 1997 PST | 1997 | 1 | 3 + | Fri Feb 28 17:32:01 1997 PST | 1997 | 9 | 5 + | Sat Mar 01 17:32:01 1997 PST | 1997 | 9 | 6 + | Tue Dec 30 17:32:01 1997 PST | 1998 | 1 | 2 + | Wed Dec 31 17:32:01 1997 PST | 1998 | 1 | 3 + | Fri Dec 31 17:32:01 1999 PST | 1999 | 52 | 5 + | Sat Jan 01 17:32:01 2000 PST | 1999 | 52 | 6 + | Sun Dec 31 17:32:01 2000 PST | 2000 | 52 | 0 + | Mon Jan 01 17:32:01 2001 PST | 2001 | 1 | 1 (56 rows) -- TO_CHAR() diff --git a/src/test/regress/sql/interval.sql b/src/test/regress/sql/interval.sql index ce9560b0b0..0498739b83 100644 --- a/src/test/regress/sql/interval.sql +++ b/src/test/regress/sql/interval.sql @@ -235,3 +235,9 @@ select interval 'P0002' AS "year only", interval 'P0002-10-15T1S' AS "year month day plus time", interval 'PT10' AS "hour only", 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';