From 63bd0db12199c5df043e1dea0f2b574f622b3a4c Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 21 May 2004 05:08:06 +0000 Subject: [PATCH] Integrate src/timezone library for all platforms. There is more we can and should do now that we control our own destiny for timezone handling, but this commit gets the bulk of the picayune diffs in place. Magnus Hagander and Tom Lane. --- configure | 2 +- configure.in | 6 +- doc/src/sgml/regress.sgml | 19 +- src/Makefile.global.in | 4 +- src/backend/Makefile | 8 +- src/backend/access/transam/xact.c | 6 +- src/backend/access/transam/xlog.c | 7 +- src/backend/bootstrap/bootparse.y | 4 +- src/backend/bootstrap/bootscanner.l | 5 +- src/backend/bootstrap/bootstrap.c | 9 +- src/backend/commands/variable.c | 257 +- src/backend/optimizer/geqo/geqo_main.c | 4 +- src/backend/postmaster/postmaster.c | 17 +- src/backend/tcop/postgres.c | 10 +- src/backend/utils/adt/date.c | 52 +- src/backend/utils/adt/datetime.c | 54 +- src/backend/utils/adt/formatting.c | 21 +- src/backend/utils/adt/misc.c | 3 +- src/backend/utils/adt/nabstime.c | 110 +- src/backend/utils/adt/timestamp.c | 102 +- src/backend/utils/error/elog.c | 13 +- src/backend/utils/misc/guc.c | 6 +- src/include/c.h | 14 +- src/include/catalog/pg_control.h | 5 +- src/include/commands/vacuum.h | 6 +- src/include/libpq/libpq-be.h | 5 +- src/include/pg_config.h.in | 3 - src/include/pg_config_manual.h | 10 +- src/include/pgtime.h | 73 + src/include/port.h | 36 +- src/include/utils/datetime.h | 26 +- src/include/utils/nabstime.h | 6 +- src/include/utils/timestamp.h | 14 +- src/port/gettimeofday.c | 5 +- .../regress/expected/abstime-solaris-1947.out | 130 - .../expected/horology-no-DST-before-1970.out | 2924 ----------------- .../expected/horology-solaris-1947.out | 2924 ----------------- .../expected/tinterval-solaris-1947.out | 170 - src/test/regress/resultmap | 27 - src/timezone/Makefile | 18 +- src/timezone/README | 12 - src/timezone/asctime.c | 75 - src/timezone/difftime.c | 84 - src/timezone/ialloc.c | 40 +- src/timezone/localtime.c | 654 +--- src/timezone/pgtz.c | 263 +- src/timezone/pgtz.h | 29 +- src/timezone/private.h | 228 +- src/timezone/scheck.c | 14 +- src/timezone/strftime.c | 480 +++ src/timezone/tzfile.h | 58 - src/timezone/zic.c | 391 +-- 52 files changed, 1342 insertions(+), 8101 deletions(-) create mode 100644 src/include/pgtime.h delete mode 100644 src/test/regress/expected/abstime-solaris-1947.out delete mode 100644 src/test/regress/expected/horology-no-DST-before-1970.out delete mode 100644 src/test/regress/expected/horology-solaris-1947.out delete mode 100644 src/test/regress/expected/tinterval-solaris-1947.out delete mode 100644 src/timezone/asctime.c delete mode 100644 src/timezone/difftime.c create mode 100644 src/timezone/strftime.c diff --git a/configure b/configure index 6a0f97097d..2c26f110b2 100755 --- a/configure +++ b/configure @@ -12014,7 +12014,7 @@ LIBOBJS="$LIBOBJS open.$ac_objext" LIBOBJS="$LIBOBJS rand.$ac_objext" ;; esac -# Win32 can't to rename or unlink on an open file +# Win32 can't do rename or unlink on an open file case $host_os in mingw*|cygwin*) LIBOBJS="$LIBOBJS dirmod.$ac_objext" ;; esac diff --git a/configure.in b/configure.in index 9262519182..d535a6ff2d 100644 --- a/configure.in +++ b/configure.in @@ -1,12 +1,12 @@ dnl Process this file with autoconf to produce a configure script. -dnl $PostgreSQL: pgsql/configure.in,v 1.355 2004/05/20 23:49:41 pgsql Exp $ +dnl $PostgreSQL: pgsql/configure.in,v 1.356 2004/05/21 05:07:54 tgl Exp $ dnl dnl Developers, please strive to achieve this order: dnl dnl 0. Initialization and options processing dnl 1. Programs dnl 2. Libraries -dnl 3. Header files +dnl 3. Header files dnl 4. Types dnl 5. Structures dnl 6. Compiler characteristics @@ -895,7 +895,7 @@ AC_LIBOBJ(open) AC_LIBOBJ(rand) ;; esac -# Win32 can't to rename or unlink on an open file +# Win32 can't do rename or unlink on an open file case $host_os in mingw*|cygwin*) AC_LIBOBJ(dirmod) ;; esac diff --git a/doc/src/sgml/regress.sgml b/doc/src/sgml/regress.sgml index 3b2afd45cc..76d242671b 100644 --- a/doc/src/sgml/regress.sgml +++ b/doc/src/sgml/regress.sgml @@ -1,4 +1,4 @@ - + Regression Tests @@ -378,20 +378,19 @@ testname/platformpattern=comparisonfilename - For example: some systems using older time zone libraries fail to apply - daylight-saving corrections to dates before 1970, causing - pre-1970 PDT times to be displayed in PST instead. This causes a - few differences in the horology regression test. + For example: some systems interpret very small floating-point values + as zero, rather than reporting an underflow error. This causes a + few differences in the float8 regression test. Therefore, we provide a variant comparison file, - horology-no-DST-before-1970.out, which includes + float8-small-is-zero.out, which includes the results to be expected on these systems. To silence the bogus - failure message on HPUX platforms, - resultmap includes + failure message on OpenBSD + platforms, resultmap includes -horology/.*-hpux=horology-no-DST-before-1970 +float8/i.86-.*-openbsd=float8-small-is-zero which will trigger on any machine for which the output of - config.guess includes -hpux. + config.guess matches i.86-.*-openbsd. Other lines in resultmap select the variant comparison file for other platforms where it's appropriate. diff --git a/src/Makefile.global.in b/src/Makefile.global.in index 1f74e2fa4c..6873ea6fa8 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -1,5 +1,5 @@ # -*-makefile-*- -# $PostgreSQL: pgsql/src/Makefile.global.in,v 1.184 2004/05/14 00:03:07 momjian Exp $ +# $PostgreSQL: pgsql/src/Makefile.global.in,v 1.185 2004/05/21 05:07:55 tgl Exp $ #------------------------------------------------------------------------------ # All PostgreSQL makefiles include this file and use the variables it sets, @@ -147,8 +147,6 @@ TK_LIBS = @TK_LIBS@ TK_LIB_SPEC = @TK_LIB_SPEC@ TK_XINCLUDES = @TK_XINCLUDES@ -USE_PGTZ = @USE_PGTZ@ - PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ diff --git a/src/backend/Makefile b/src/backend/Makefile index 920a3a244d..2b78b9e7e8 100644 --- a/src/backend/Makefile +++ b/src/backend/Makefile @@ -4,7 +4,7 @@ # # Copyright (c) 1994, Regents of the University of California # -# $PostgreSQL: pgsql/src/backend/Makefile,v 1.99 2004/04/30 16:08:01 momjian Exp $ +# $PostgreSQL: pgsql/src/backend/Makefile,v 1.100 2004/05/21 05:07:55 tgl Exp $ # #------------------------------------------------------------------------- @@ -14,11 +14,7 @@ include $(top_builddir)/src/Makefile.global DIRS := access bootstrap catalog parser commands executor lib libpq \ main nodes optimizer port postmaster regex rewrite \ - storage tcop utils - -ifeq ($(USE_PGTZ), yes) -DIRS+= $(top_builddir)/src/timezone -endif + storage tcop utils $(top_builddir)/src/timezone OBJS := $(DIRS:%=%/SUBSYS.o) diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index 4eefbb91ab..b29ccdf5f7 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.165 2004/04/05 03:11:39 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.166 2004/05/21 05:07:56 tgl Exp $ * * NOTES * Transaction aborts can now occur two ways: @@ -1828,7 +1828,7 @@ xact_desc(char *buf, uint8 xl_info, char *rec) if (info == XLOG_XACT_COMMIT) { xl_xact_commit *xlrec = (xl_xact_commit *) rec; - struct tm *tm = localtime(&xlrec->xtime); + struct pg_tm *tm = pg_localtime(&xlrec->xtime); sprintf(buf + strlen(buf), "commit: %04u-%02u-%02u %02u:%02u:%02u", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, @@ -1838,7 +1838,7 @@ xact_desc(char *buf, uint8 xl_info, char *rec) else if (info == XLOG_XACT_ABORT) { xl_xact_abort *xlrec = (xl_xact_abort *) rec; - struct tm *tm = localtime(&xlrec->xtime); + struct pg_tm *tm = pg_localtime(&xlrec->xtime); sprintf(buf + strlen(buf), "abort: %04u-%02u-%02u %02u:%02u:%02u", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index b6199706f6..2d92c0c0c0 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.140 2004/05/07 00:24:57 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.141 2004/05/21 05:07:56 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -18,7 +18,6 @@ #include #include #include -#include #include "access/clog.h" #include "access/transam.h" @@ -2764,9 +2763,9 @@ str_time(time_t tnow) { static char buf[128]; - strftime(buf, sizeof(buf), + pg_strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", - localtime(&tnow)); + pg_localtime(&tnow)); return buf; } diff --git a/src/backend/bootstrap/bootparse.y b/src/backend/bootstrap/bootparse.y index 679ef5577f..debf24e892 100644 --- a/src/backend/bootstrap/bootparse.y +++ b/src/backend/bootstrap/bootparse.y @@ -9,14 +9,13 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/bootstrap/bootparse.y,v 1.66 2004/05/05 04:48:45 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/bootstrap/bootparse.y,v 1.67 2004/05/21 05:07:56 tgl Exp $ * *------------------------------------------------------------------------- */ #include "postgres.h" -#include #include #include "access/attnum.h" @@ -39,6 +38,7 @@ #include "nodes/parsenodes.h" #include "nodes/pg_list.h" #include "nodes/primnodes.h" +#include "pgtime.h" #include "rewrite/prs2lock.h" #include "storage/block.h" #include "storage/fd.h" diff --git a/src/backend/bootstrap/bootscanner.l b/src/backend/bootstrap/bootscanner.l index d8f683596d..3f8777ea66 100644 --- a/src/backend/bootstrap/bootscanner.l +++ b/src/backend/bootstrap/bootscanner.l @@ -9,14 +9,12 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/bootstrap/bootscanner.l,v 1.33 2004/02/24 22:06:32 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/bootstrap/bootscanner.l,v 1.34 2004/05/21 05:07:56 tgl Exp $ * *------------------------------------------------------------------------- */ #include "postgres.h" -#include - #include "access/attnum.h" #include "access/htup.h" #include "access/itup.h" @@ -31,6 +29,7 @@ #include "nodes/pg_list.h" #include "nodes/primnodes.h" #include "parser/scansup.h" +#include "pgtime.h" #include "rewrite/prs2lock.h" #include "storage/block.h" #include "storage/fd.h" diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index c7fcb40087..3aca65e845 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -8,14 +8,13 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.178 2004/04/01 21:28:43 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.179 2004/05/21 05:07:56 tgl Exp $ * *------------------------------------------------------------------------- */ #include "postgres.h" #include -#include #include #include #ifdef HAVE_GETOPT_H @@ -34,6 +33,7 @@ #include "executor/executor.h" #include "libpq/pqsignal.h" #include "miscadmin.h" +#include "pgtime.h" #include "storage/freespace.h" #include "storage/ipc.h" #include "storage/pg_shmem.h" @@ -392,8 +392,8 @@ BootstrapMain(int argc, char *argv[]) if (IsUnderPostmaster) { #ifdef EXEC_BACKEND - read_nondefault_variables(); read_backend_variables(backendID,NULL); + read_nondefault_variables(); SSDataBaseInit(xlogop); #endif @@ -401,6 +401,9 @@ BootstrapMain(int argc, char *argv[]) else ProcessConfigFile(PGC_POSTMASTER); + /* If timezone is not set, determine what the OS uses */ + pg_timezone_initialize(); + if (IsUnderPostmaster) { /* diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c index f83ce51bac..45ed717951 100644 --- a/src/backend/commands/variable.c +++ b/src/backend/commands/variable.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/variable.c,v 1.94 2004/05/07 00:24:57 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/variable.c,v 1.95 2004/05/21 05:07:57 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -17,30 +17,19 @@ #include "postgres.h" #include -#include #include "access/xact.h" #include "catalog/pg_shadow.h" #include "commands/variable.h" #include "miscadmin.h" #include "parser/scansup.h" +#include "pgtime.h" #include "utils/builtins.h" #include "utils/guc.h" #include "utils/syscache.h" #include "utils/tqual.h" #include "mb/pg_wchar.h" -/* - * Some systems have tzname[] but don't declare it in . Use this - * to duplicate the test in AC_STRUCT_TIMEZONE. - */ -#ifdef HAVE_TZNAME -#ifndef tzname /* For SGI. */ -extern char *tzname[]; -#endif -#endif - - /* * DATESTYLE */ @@ -237,149 +226,6 @@ assign_datestyle(const char *value, bool doit, GucSource source) * TIMEZONE */ -/* - * Storage for TZ env var is allocated with an arbitrary size of 64 bytes. - */ -#define TZBUF_LEN 64 - -static char tzbuf[TZBUF_LEN]; - -/* - * First time through, we remember the original environment TZ value, if any. - */ -static bool have_saved_tz = false; -static char orig_tzbuf[TZBUF_LEN]; - -/* - * Convenience subroutine for assigning the value of TZ - */ -static void -set_tz(const char *tz) -{ - strcpy(tzbuf, "TZ="); - strncpy(tzbuf + 3, tz, sizeof(tzbuf) - 4); - if (putenv(tzbuf) != 0) /* shouldn't happen? */ - elog(LOG, "could not set TZ environment variable"); - tzset(); -} - -/* - * Remove any value of TZ we have established - * - * Note: this leaves us with *no* value of TZ in the environment, and - * is therefore only appropriate for reverting to that state, not for - * reverting to a state where TZ was set to something else. - */ -static void -clear_tz(void) -{ - /* - * unsetenv() works fine, but is BSD, not POSIX, and is not available - * under Solaris, among others. Apparently putenv() called as below - * clears the process-specific environment variables. Other - * reasonable arguments to putenv() (e.g. "TZ=", "TZ", "") result in a - * core dump (under Linux anyway). - thomas 1998-01-26 - */ - if (tzbuf[0] == 'T') - { - strcpy(tzbuf, "="); - if (putenv(tzbuf) != 0) - elog(LOG, "could not clear TZ environment variable"); - tzset(); - } -} - -/* - * Check whether tzset() succeeded - * - * Unfortunately, tzset doesn't offer any well-defined way to detect that the - * value of TZ was bad. Often it will just select UTC (GMT) as the effective - * timezone. We use the following heuristics: - * - * If tzname[1] is a nonempty string, *or* the global timezone variable is - * not zero, then tzset must have recognized the TZ value as something - * different from UTC. Return true. - * - * Otherwise, check to see if the TZ name is a known spelling of "UTC" - * (ie, appears in our internal tables as a timezone equivalent to UTC). - * If so, accept it. - * - * This will reject nonstandard spellings of UTC unless tzset() chose to - * set tzname[1] as well as tzname[0]. The glibc version of tzset() will - * do so, but on other systems we may be tightening the spec a little. - * - * Another problem is that on some platforms (eg HPUX), if tzset thinks the - * input is bogus then it will adopt the system default timezone, which we - * really can't tell is not the intended translation of the input. - * - * Still, it beats failing to detect bad TZ names at all, and a silent - * failure mode of adopting the system-wide default is much better than - * a silent failure mode of adopting UTC. - * - * NB: this must NOT ereport(ERROR). The caller must get control back so that - * it can restore the old value of TZ if we don't like the new one. - */ -static bool -tzset_succeeded(const char *tz) -{ - char *tztmp; - int tzval; - - /* - * Check first set of heuristics to say that tzset definitely worked. - */ -#ifdef HAVE_TZNAME - if (tzname[1] && tzname[1][0] != '\0') - return true; -#endif - if (TIMEZONE_GLOBAL != 0) - return true; - - /* - * Check for known spellings of "UTC". Note we must downcase the - * input before passing it to DecodePosixTimezone(). - */ - tztmp = downcase_truncate_identifier(tz, strlen(tz), false); - if (DecodePosixTimezone(tztmp, &tzval) == 0) - if (tzval == 0) - return true; - - return false; -} - -/* - * Check whether timezone is acceptable. - * - * What we are doing here is checking for leap-second-aware timekeeping. - * We need to reject such TZ settings because they'll wreak havoc with our - * date/time arithmetic. - * - * NB: this must NOT ereport(ERROR). The caller must get control back so that - * it can restore the old value of TZ if we don't like the new one. - */ -static bool -tz_acceptable(void) -{ - struct tm tt; - time_t time2000; - - /* - * To detect leap-second timekeeping, compute the time_t value for - * local midnight, 2000-01-01. Insist that this be a multiple of 60; - * any partial-minute offset has to be due to leap seconds. - */ - MemSet(&tt, 0, sizeof(tt)); - tt.tm_year = 100; - tt.tm_mon = 0; - tt.tm_mday = 1; - tt.tm_isdst = -1; - time2000 = mktime(&tt); - if ((time2000 % 60) != 0) - return false; - - return true; -} - /* * assign_timezone: GUC assign_hook for timezone */ @@ -390,21 +236,6 @@ assign_timezone(const char *value, bool doit, GucSource source) char *endptr; double hours; - /* - * On first call, see if there is a TZ in the original environment. - * Save that value permanently. - */ - if (!have_saved_tz) - { - char *orig_tz = getenv("TZ"); - - if (orig_tz) - StrNCpy(orig_tzbuf, orig_tz, sizeof(orig_tzbuf)); - else - orig_tzbuf[0] = '\0'; - have_saved_tz = true; - } - /* * Check for INTERVAL 'foo' */ @@ -476,36 +307,21 @@ assign_timezone(const char *value, bool doit, GucSource source) { /* * UNKNOWN is the value shown as the "default" for TimeZone in - * guc.c. We interpret it as meaning the original TZ - * inherited from the environment. Note that if there is an - * original TZ setting, we will return that rather than + * guc.c. We interpret it as being a complete no-op; we don't + * change the timezone setting. Note that if there is a known + * timezone setting, we will return that name rather than * UNKNOWN as the canonical spelling. + * + * During GUC initialization, since the timezone library isn't + * set up yet, pg_get_current_timezone will return NULL and we + * will leave the setting as UNKNOWN. If this isn't overridden + * from the config file then pg_timezone_initialize() will + * eventually select a default value from the environment. */ - if (doit) - { - bool ok; + const char *curzone = pg_get_current_timezone(); - /* Revert to original setting of TZ, whatever it was */ - if (orig_tzbuf[0]) - { - set_tz(orig_tzbuf); - ok = tzset_succeeded(orig_tzbuf) && tz_acceptable(); - } - else - { - clear_tz(); - ok = tz_acceptable(); - } - - if (ok) - HasCTZSet = false; - else - { - /* Bogus, so force UTC (equivalent to INTERVAL 0) */ - CTimeZone = 0; - HasCTZSet = true; - } - } + if (curzone) + value = curzone; } else { @@ -514,22 +330,22 @@ assign_timezone(const char *value, bool doit, GucSource source) * * We have to actually apply the change before we can have any * hope of checking it. So, save the old value in case we - * have to back out. Note that it's possible the old setting - * is in tzbuf, so we'd better copy it. + * have to back out. We have to copy since pg_get_current_timezone + * returns a pointer to its static state. */ - char save_tzbuf[TZBUF_LEN]; + const char *cur_tz; char *save_tz; bool known, acceptable; - save_tz = getenv("TZ"); - if (save_tz) - StrNCpy(save_tzbuf, save_tz, sizeof(save_tzbuf)); + cur_tz = pg_get_current_timezone(); + if (cur_tz) + save_tz = pstrdup(cur_tz); + else + save_tz = NULL; - set_tz(value); - - known = tzset_succeeded(value); - acceptable = tz_acceptable(); + known = pg_tzset(value); + acceptable = known ? tz_acceptable() : false; if (doit && known && acceptable) { @@ -544,9 +360,9 @@ assign_timezone(const char *value, bool doit, GucSource source) * a fixed offset, we still are. */ if (save_tz) - set_tz(save_tzbuf); - else - clear_tz(); + pg_tzset(save_tz); + else /* TZ library not initialized yet */ + select_default_timezone(); /* Complain if it was bad */ if (!known) { @@ -578,17 +394,16 @@ assign_timezone(const char *value, bool doit, GucSource source) /* * Prepare the canonical string to return. GUC wants it malloc'd. */ - result = (char *) malloc(sizeof(tzbuf)); - if (!result) - return NULL; - if (HasCTZSet) - snprintf(result, sizeof(tzbuf), "%.5f", + { + result = (char *) malloc(64); + if (!result) + return NULL; + snprintf(result, 64, "%.5f", (double) (-CTimeZone) / 3600.0); - else if (tzbuf[0] == 'T') - strcpy(result, tzbuf + 3); + } else - strcpy(result, "UNKNOWN"); + result = strdup(value); return result; } @@ -599,7 +414,7 @@ assign_timezone(const char *value, bool doit, GucSource source) const char * show_timezone(void) { - char *tzn; + const char *tzn; if (HasCTZSet) { @@ -612,7 +427,7 @@ show_timezone(void) IntervalPGetDatum(&interval))); } else - tzn = getenv("TZ"); + tzn = pg_get_current_timezone(); if (tzn != NULL) return tzn; diff --git a/src/backend/optimizer/geqo/geqo_main.c b/src/backend/optimizer/geqo/geqo_main.c index caba3b593f..902fcbcd26 100644 --- a/src/backend/optimizer/geqo/geqo_main.c +++ b/src/backend/optimizer/geqo/geqo_main.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/optimizer/geqo/geqo_main.c,v 1.43 2004/01/23 23:54:21 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/geqo/geqo_main.c,v 1.44 2004/05/21 05:07:57 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -24,7 +24,6 @@ #include "postgres.h" -#include #include #include "optimizer/geqo.h" @@ -32,6 +31,7 @@ #include "optimizer/geqo_mutation.h" #include "optimizer/geqo_pool.h" #include "optimizer/geqo_selection.h" +#include "pgtime.h" /* diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 2abb4abb95..c141ca6787 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -37,7 +37,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.392 2004/05/19 19:11:25 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.393 2004/05/21 05:07:57 tgl Exp $ * * NOTES * @@ -66,11 +66,9 @@ #include #include #include -#include #include #include #include -#include #include #include #include @@ -99,6 +97,7 @@ #include "libpq/pqsignal.h" #include "miscadmin.h" #include "nodes/nodes.h" +#include "pgtime.h" #include "storage/fd.h" #include "storage/ipc.h" #include "storage/pg_shmem.h" @@ -636,6 +635,10 @@ PostmasterMain(int argc, char *argv[]) SetDataDir(potential_DataDir); ProcessConfigFile(PGC_POSTMASTER); + + /* If timezone is not set, determine what the OS uses */ + pg_timezone_initialize(); + #ifdef EXEC_BACKEND write_nondefault_variables(PGC_POSTMASTER); #endif @@ -906,7 +909,7 @@ PostmasterMain(int argc, char *argv[]) { time_t now = time(NULL); - (void) localtime(&now); + (void) pg_localtime(&now); } /* @@ -2704,8 +2707,8 @@ SubPostmasterMain(int argc, char* argv[]) DataDir = strdup(argv[argc++]); /* Read in file-based context */ - read_nondefault_variables(); read_backend_variables(backendID,&port); + read_nondefault_variables(); /* Remaining initialization */ pgstat_init_forkexec_backend(); @@ -3356,6 +3359,8 @@ write_backend_variables(Port *port) write_var(debug_flag,fp); write_var(PostmasterPid,fp); + fwrite((void *)my_exec_path, MAXPGPATH, 1, fp); + /* Release file */ if (FreeFile(fp)) { @@ -3418,6 +3423,8 @@ read_backend_variables(unsigned long id, Port *port) read_var(debug_flag,fp); read_var(PostmasterPid,fp); + fread((void *)my_exec_path, MAXPGPATH, 1, fp); + /* Release file */ FreeFile(fp); if (unlink(filename) != 0) diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 1c3e0c2847..d097612ba3 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.412 2004/05/19 21:17:33 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.413 2004/05/21 05:07:58 tgl Exp $ * * NOTES * this is the "main" module of the postgres backend and @@ -21,8 +21,6 @@ #include #include -#include -#include #include #include #include @@ -48,6 +46,7 @@ #include "optimizer/planner.h" #include "parser/analyze.h" #include "parser/parser.h" +#include "pgtime.h" #include "rewrite/rewriteHandler.h" #include "storage/freespace.h" #include "storage/ipc.h" @@ -2145,7 +2144,7 @@ PostgresMain(int argc, char *argv[], const char *username) char stack_base; StringInfoData input_message; volatile bool send_rfq = true; - + /* * Catch standard options before doing much else. This even works on * systems without getopt_long. @@ -2566,6 +2565,9 @@ PostgresMain(int argc, char *argv[], const char *username) } else ProcessConfigFile(PGC_POSTMASTER); + /* If timezone is not set, determine what the OS uses */ + pg_timezone_initialize(); + /* * Set up signal handlers and masks. * diff --git a/src/backend/utils/adt/date.c b/src/backend/utils/adt/date.c index 555ba5455a..ab6e41d2e4 100644 --- a/src/backend/utils/adt/date.c +++ b/src/backend/utils/adt/date.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/date.c,v 1.96 2004/05/07 00:24:58 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/date.c,v 1.97 2004/05/21 05:08:01 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -17,13 +17,13 @@ #include #include -#include #include #include "access/hash.h" #include "libpq/pqformat.h" #include "miscadmin.h" #include "parser/scansup.h" +#include "pgtime.h" #include "utils/builtins.h" #include "utils/date.h" #include "utils/nabstime.h" @@ -38,10 +38,10 @@ #endif -static int time2tm(TimeADT time, struct tm * tm, fsec_t *fsec); -static int timetz2tm(TimeTzADT *time, struct tm * tm, fsec_t *fsec, int *tzp); -static int tm2time(struct tm * tm, fsec_t fsec, TimeADT *result); -static int tm2timetz(struct tm * tm, fsec_t fsec, int tz, TimeTzADT *result); +static int time2tm(TimeADT time, struct pg_tm * tm, fsec_t *fsec); +static int timetz2tm(TimeTzADT *time, struct pg_tm * tm, fsec_t *fsec, int *tzp); +static int tm2time(struct pg_tm * tm, fsec_t fsec, TimeADT *result); +static int tm2timetz(struct pg_tm * tm, fsec_t fsec, int tz, TimeTzADT *result); static void AdjustTimeForTypmod(TimeADT *time, int32 typmod); /***************************************************************************** @@ -58,7 +58,7 @@ date_in(PG_FUNCTION_ARGS) char *str = PG_GETARG_CSTRING(0); DateADT date; fsec_t fsec; - struct tm tt, + struct pg_tm tt, *tm = &tt; int tzp; int dtype; @@ -112,7 +112,7 @@ date_out(PG_FUNCTION_ARGS) { DateADT date = PG_GETARG_DATEADT(0); char *result; - struct tm tt, + struct pg_tm tt, *tm = &tt; char buf[MAXDATELEN + 1]; @@ -293,7 +293,7 @@ static TimestampTz date2timestamptz(DateADT dateVal) { TimestampTz result; - struct tm tt, + struct pg_tm tt, *tm = &tt; j2date(dateVal + POSTGRES_EPOCH_JDATE, @@ -733,7 +733,7 @@ timestamp_date(PG_FUNCTION_ARGS) { Timestamp timestamp = PG_GETARG_TIMESTAMP(0); DateADT result; - struct tm tt, + struct pg_tm tt, *tm = &tt; fsec_t fsec; @@ -774,7 +774,7 @@ timestamptz_date(PG_FUNCTION_ARGS) { TimestampTz timestamp = PG_GETARG_TIMESTAMP(0); DateADT result; - struct tm tt, + struct pg_tm tt, *tm = &tt; fsec_t fsec; int tz; @@ -802,7 +802,7 @@ abstime_date(PG_FUNCTION_ARGS) { AbsoluteTime abstime = PG_GETARG_ABSOLUTETIME(0); DateADT result; - struct tm tt, + struct pg_tm tt, *tm = &tt; int tz; @@ -903,7 +903,7 @@ time_in(PG_FUNCTION_ARGS) int32 typmod = PG_GETARG_INT32(2); TimeADT result; fsec_t fsec; - struct tm tt, + struct pg_tm tt, *tm = &tt; int tz; int nf; @@ -932,7 +932,7 @@ time_in(PG_FUNCTION_ARGS) * Convert a tm structure to a time data type. */ static int -tm2time(struct tm * tm, fsec_t fsec, TimeADT *result) +tm2time(struct pg_tm * tm, fsec_t fsec, TimeADT *result) { #ifdef HAVE_INT64_TIMESTAMP *result = ((((((tm->tm_hour * 60) + tm->tm_min) * 60) + tm->tm_sec) @@ -949,7 +949,7 @@ tm2time(struct tm * tm, fsec_t fsec, TimeADT *result) * local time zone. If out of this range, leave as GMT. - tgl 97/05/27 */ static int -time2tm(TimeADT time, struct tm * tm, fsec_t *fsec) +time2tm(TimeADT time, struct pg_tm * tm, fsec_t *fsec) { #ifdef HAVE_INT64_TIMESTAMP tm->tm_hour = (time / INT64CONST(3600000000)); @@ -977,7 +977,7 @@ time_out(PG_FUNCTION_ARGS) { TimeADT time = PG_GETARG_TIMEADT(0); char *result; - struct tm tt, + struct pg_tm tt, *tm = &tt; fsec_t fsec; char buf[MAXDATELEN + 1]; @@ -1338,7 +1338,7 @@ timestamp_time(PG_FUNCTION_ARGS) { Timestamp timestamp = PG_GETARG_TIMESTAMP(0); TimeADT result; - struct tm tt, + struct pg_tm tt, *tm = &tt; fsec_t fsec; @@ -1373,7 +1373,7 @@ timestamptz_time(PG_FUNCTION_ARGS) { TimestampTz timestamp = PG_GETARG_TIMESTAMP(0); TimeADT result; - struct tm tt, + struct pg_tm tt, *tm = &tt; int tz; fsec_t fsec; @@ -1641,7 +1641,7 @@ time_part(PG_FUNCTION_ARGS) if (type == UNITS) { fsec_t fsec; - struct tm tt, + struct pg_tm tt, *tm = &tt; time2tm(time, tm, &fsec); @@ -1731,7 +1731,7 @@ time_part(PG_FUNCTION_ARGS) * Convert a tm structure to a time data type. */ static int -tm2timetz(struct tm * tm, fsec_t fsec, int tz, TimeTzADT *result) +tm2timetz(struct pg_tm * tm, fsec_t fsec, int tz, TimeTzADT *result) { #ifdef HAVE_INT64_TIMESTAMP result->time = ((((((tm->tm_hour * 60) + tm->tm_min) * 60) + tm->tm_sec) @@ -1755,7 +1755,7 @@ timetz_in(PG_FUNCTION_ARGS) int32 typmod = PG_GETARG_INT32(2); TimeTzADT *result; fsec_t fsec; - struct tm tt, + struct pg_tm tt, *tm = &tt; int tz; int nf; @@ -1786,7 +1786,7 @@ timetz_out(PG_FUNCTION_ARGS) { TimeTzADT *time = PG_GETARG_TIMETZADT_P(0); char *result; - struct tm tt, + struct pg_tm tt, *tm = &tt; fsec_t fsec; int tz; @@ -1844,7 +1844,7 @@ timetz_send(PG_FUNCTION_ARGS) * Convert TIME WITH TIME ZONE data type to POSIX time structure. */ static int -timetz2tm(TimeTzADT *time, struct tm * tm, fsec_t *fsec, int *tzp) +timetz2tm(TimeTzADT *time, struct pg_tm * tm, fsec_t *fsec, int *tzp) { #ifdef HAVE_INT64_TIMESTAMP int64 trem = time->time; @@ -2237,7 +2237,7 @@ time_timetz(PG_FUNCTION_ARGS) { TimeADT time = PG_GETARG_TIMEADT(0); TimeTzADT *result; - struct tm tt, + struct pg_tm tt, *tm = &tt; fsec_t fsec; int tz; @@ -2263,7 +2263,7 @@ timestamptz_timetz(PG_FUNCTION_ARGS) { TimestampTz timestamp = PG_GETARG_TIMESTAMP(0); TimeTzADT *result; - struct tm tt, + struct pg_tm tt, *tm = &tt; int tz; fsec_t fsec; @@ -2394,7 +2394,7 @@ timetz_part(PG_FUNCTION_ARGS) double dummy; int tz; fsec_t fsec; - struct tm tt, + struct pg_tm tt, *tm = &tt; timetz2tm(time, tm, &fsec, &tz); diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c index 040e1691da..8402d8cccb 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.127 2004/05/07 00:24:58 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.128 2004/05/21 05:08:01 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -27,15 +27,16 @@ static int DecodeNumber(int flen, char *field, bool haveTextMonth, int fmask, int *tmask, - struct tm * tm, fsec_t *fsec, int *is2digits); + struct pg_tm * tm, fsec_t *fsec, int *is2digits); static int DecodeNumberField(int len, char *str, int fmask, int *tmask, - struct tm * tm, fsec_t *fsec, int *is2digits); + struct pg_tm * tm, fsec_t *fsec, int *is2digits); static int DecodeTime(char *str, int fmask, int *tmask, - struct tm * tm, fsec_t *fsec); + struct pg_tm * tm, fsec_t *fsec); static int DecodeTimezone(char *str, int *tzp); +static int DecodePosixTimezone(char *str, int *tzp); static datetkn *datebsearch(char *key, datetkn *base, unsigned int nel); -static int DecodeDate(char *str, int fmask, int *tmask, struct tm * tm); +static int DecodeDate(char *str, int fmask, int *tmask, struct pg_tm * tm); static void TrimTrailingZeros(char *str); @@ -913,7 +914,7 @@ ParseDateTime(const char *timestr, char *lowstr, */ int DecodeDateTime(char **field, int *ftype, int nf, - int *dtype, struct tm * tm, fsec_t *fsec, int *tzp) + int *dtype, struct pg_tm * tm, fsec_t *fsec, int *tzp) { int fmask = 0, tmask, @@ -1566,9 +1567,9 @@ DecodeDateTime(char **field, int *ftype, int nf, /* DetermineLocalTimeZone() * - * Given a struct tm in which tm_year, tm_mon, tm_mday, tm_hour, tm_min, and + * Given a struct pg_tm in which tm_year, tm_mon, tm_mday, tm_hour, tm_min, and * tm_sec fields are set, attempt to determine the applicable local zone - * (ie, regular or daylight-savings time) at that time. Set the struct tm's + * (ie, regular or daylight-savings time) at that time. Set the struct pg_tm's * tm_isdst field accordingly, and return the actual timezone offset. * * Note: this subroutine exists because mktime() has such a spectacular @@ -1577,7 +1578,7 @@ DecodeDateTime(char **field, int *ftype, int nf, * mktime() anywhere else. */ int -DetermineLocalTimeZone(struct tm * tm) +DetermineLocalTimeZone(struct pg_tm * tm) { int tz; @@ -1600,7 +1601,7 @@ DetermineLocalTimeZone(struct tm * tm) delta1, delta2; time_t mytime; - struct tm *tx; + struct pg_tm *tx; day = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) - UNIX_EPOCH_JDATE; mysec = tm->tm_sec + (tm->tm_min + (day * 24 + tm->tm_hour) * 60) * 60; @@ -1610,7 +1611,7 @@ DetermineLocalTimeZone(struct tm * tm) * Use localtime to convert that time_t to broken-down time, * and reassemble to get a representation of local time. */ - tx = localtime(&mytime); + tx = pg_localtime(&mytime); if (!tx) ereport(ERROR, (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), @@ -1624,7 +1625,6 @@ DetermineLocalTimeZone(struct tm * tm) * computable as mysec - locsec. */ delta1 = mysec - locsec; - /* * However, if that GMT time and the local time we are * actually interested in are on opposite sides of a @@ -1635,7 +1635,7 @@ DetermineLocalTimeZone(struct tm * tm) */ mysec += delta1; mytime = (time_t) mysec; - tx = localtime(&mytime); + tx = pg_localtime(&mytime); if (!tx) ereport(ERROR, (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), @@ -1660,7 +1660,7 @@ DetermineLocalTimeZone(struct tm * tm) { mysec += (delta2 - delta1); mytime = (time_t) mysec; - tx = localtime(&mytime); + tx = pg_localtime(&mytime); if (!tx) ereport(ERROR, (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), @@ -1698,7 +1698,7 @@ DetermineLocalTimeZone(struct tm * tm) */ int DecodeTimeOnly(char **field, int *ftype, int nf, - int *dtype, struct tm * tm, fsec_t *fsec, int *tzp) + int *dtype, struct pg_tm * tm, fsec_t *fsec, int *tzp) { int fmask = 0, tmask, @@ -2201,7 +2201,7 @@ DecodeTimeOnly(char **field, int *ftype, int nf, /* timezone not specified? then find local timezone if possible */ if ((tzp != NULL) && (!(fmask & DTK_M(TZ)))) { - struct tm tt, + struct pg_tm tt, *tmp = &tt; /* @@ -2236,7 +2236,7 @@ DecodeTimeOnly(char **field, int *ftype, int nf, * Insist on a complete set of fields. */ static int -DecodeDate(char *str, int fmask, int *tmask, struct tm * tm) +DecodeDate(char *str, int fmask, int *tmask, struct pg_tm * tm) { fsec_t fsec; int nf = 0; @@ -2394,7 +2394,7 @@ DecodeDate(char *str, int fmask, int *tmask, struct tm * tm) * can be used to represent time spans. */ static int -DecodeTime(char *str, int fmask, int *tmask, struct tm * tm, fsec_t *fsec) +DecodeTime(char *str, int fmask, int *tmask, struct pg_tm * tm, fsec_t *fsec) { char *cp; @@ -2461,7 +2461,7 @@ DecodeTime(char *str, int fmask, int *tmask, struct tm * tm, fsec_t *fsec) */ static int DecodeNumber(int flen, char *str, bool haveTextMonth, int fmask, - int *tmask, struct tm * tm, fsec_t *fsec, int *is2digits) + int *tmask, struct pg_tm * tm, fsec_t *fsec, int *is2digits) { int val; char *cp; @@ -2651,7 +2651,7 @@ DecodeNumber(int flen, char *str, bool haveTextMonth, int fmask, */ static int DecodeNumberField(int len, char *str, int fmask, - int *tmask, struct tm * tm, fsec_t *fsec, int *is2digits) + int *tmask, struct pg_tm * tm, fsec_t *fsec, int *is2digits) { char *cp; @@ -2797,10 +2797,8 @@ DecodeTimezone(char *str, int *tzp) * - thomas 2000-03-15 * * Return 0 if okay (and set *tzp), a DTERR code if not okay. - * - * NB: this must *not* ereport on failure; see commands/variable.c. */ -int +static int DecodePosixTimezone(char *str, int *tzp) { int val, @@ -2911,7 +2909,7 @@ DecodeSpecial(int field, char *lowtoken, int *val) * preceding an hh:mm:ss field. - thomas 1998-04-30 */ int -DecodeInterval(char **field, int *ftype, int nf, int *dtype, struct tm * tm, fsec_t *fsec) +DecodeInterval(char **field, int *ftype, int nf, int *dtype, struct pg_tm * tm, fsec_t *fsec) { int is_before = FALSE; char *cp; @@ -3365,7 +3363,7 @@ datebsearch(char *key, datetkn *base, unsigned int nel) * Encode date as local time. */ int -EncodeDateOnly(struct tm * tm, int style, char *str) +EncodeDateOnly(struct pg_tm * tm, int style, char *str) { if ((tm->tm_mon < 1) || (tm->tm_mon > 12)) return -1; @@ -3425,7 +3423,7 @@ EncodeDateOnly(struct tm * tm, int style, char *str) * Encode time fields only. */ int -EncodeTimeOnly(struct tm * tm, fsec_t fsec, int *tzp, int style, char *str) +EncodeTimeOnly(struct pg_tm * tm, fsec_t fsec, int *tzp, int style, char *str) { if ((tm->tm_hour < 0) || (tm->tm_hour > 24)) return -1; @@ -3478,7 +3476,7 @@ EncodeTimeOnly(struct tm * tm, fsec_t fsec, int *tzp, int style, char *str) * European - dd/mm/yyyy */ int -EncodeDateTime(struct tm * tm, fsec_t fsec, int *tzp, char **tzn, int style, char *str) +EncodeDateTime(struct pg_tm * tm, fsec_t fsec, int *tzp, char **tzn, int style, char *str) { int day, hour, @@ -3709,7 +3707,7 @@ EncodeDateTime(struct tm * tm, fsec_t fsec, int *tzp, char **tzn, int style, cha * - thomas 1998-04-30 */ int -EncodeInterval(struct tm * tm, fsec_t fsec, int style, char *str) +EncodeInterval(struct pg_tm * tm, fsec_t fsec, int style, char *str) { int is_before = FALSE; int is_nonzero = FALSE; diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c index 6a9f26e000..5df25da8e9 100644 --- a/src/backend/utils/adt/formatting.c +++ b/src/backend/utils/adt/formatting.c @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------- * formatting.c * - * $PostgreSQL: pgsql/src/backend/utils/adt/formatting.c,v 1.74 2004/05/07 00:24:58 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/formatting.c,v 1.75 2004/05/21 05:08:02 tgl Exp $ * * * Portions Copyright (c) 1999-2003, PostgreSQL Global Development Group @@ -70,7 +70,6 @@ #include "postgres.h" #include -#include #include #include #include @@ -410,7 +409,7 @@ typedef struct */ typedef struct TmToChar { - struct tm tm; /* classic 'tm' struct */ + struct pg_tm tm; /* classic 'tm' struct */ fsec_t fsec; /* fractional seconds */ char *tzn; /* timezone */ } TmToChar; @@ -897,7 +896,7 @@ static int dch_global(int arg, char *inout, int suf, int flag, FormatNode *node, static int dch_time(int arg, char *inout, int suf, int flag, FormatNode *node, void *data); static int dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data); static void do_to_timestamp(text *date_txt, text *fmt, - struct tm *tm, fsec_t *fsec); + struct pg_tm *tm, fsec_t *fsec); static char *fill_str(char *str, int c, int max); static FormatNode *NUM_cache(int len, NUMDesc *Num, char *pars_str, bool *shouldFree); static char *int_to_roman(int number); @@ -1695,7 +1694,7 @@ static int dch_time(int arg, char *inout, int suf, int flag, FormatNode *node, void *data) { char *p_inout = inout; - struct tm *tm = NULL; + struct pg_tm *tm = NULL; TmFromChar *tmfc = NULL; TmToChar *tmtc = NULL; @@ -2057,7 +2056,7 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data) *p_inout; int i, len; - struct tm *tm = NULL; + struct pg_tm *tm = NULL; TmFromChar *tmfc = NULL; TmToChar *tmtc = NULL; @@ -2768,7 +2767,7 @@ static text * datetime_to_char_body(TmToChar *tmtc, text *fmt) { FormatNode *format; - struct tm *tm = NULL; + struct pg_tm *tm = NULL; char *fmt_str, *result; bool incache; @@ -2962,7 +2961,7 @@ to_timestamp(PG_FUNCTION_ARGS) text *fmt = PG_GETARG_TEXT_P(1); Timestamp result; int tz; - struct tm tm; + struct pg_tm tm; fsec_t fsec; do_to_timestamp(date_txt, fmt, &tm, &fsec); @@ -2988,7 +2987,7 @@ to_date(PG_FUNCTION_ARGS) text *date_txt = PG_GETARG_TEXT_P(0); text *fmt = PG_GETARG_TEXT_P(1); DateADT result; - struct tm tm; + struct pg_tm tm; fsec_t fsec; do_to_timestamp(date_txt, fmt, &tm, &fsec); @@ -3001,12 +3000,12 @@ to_date(PG_FUNCTION_ARGS) /* * do_to_timestamp: shared code for to_timestamp and to_date * - * Parse the 'date_txt' according to 'fmt', return results as a struct tm + * Parse the 'date_txt' according to 'fmt', return results as a struct pg_tm * and fractional seconds. */ static void do_to_timestamp(text *date_txt, text *fmt, - struct tm *tm, fsec_t *fsec) + struct pg_tm *tm, fsec_t *fsec) { FormatNode *format; TmFromChar tmfc; diff --git a/src/backend/utils/adt/misc.c b/src/backend/utils/adt/misc.c index 2bd013eb14..673b175bbc 100644 --- a/src/backend/utils/adt/misc.c +++ b/src/backend/utils/adt/misc.c @@ -8,14 +8,13 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/misc.c,v 1.32 2003/11/29 19:51:58 pgsql Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/misc.c,v 1.33 2004/05/21 05:08:02 tgl Exp $ * *------------------------------------------------------------------------- */ #include "postgres.h" #include -#include #include "commands/dbcommands.h" #include "miscadmin.h" diff --git a/src/backend/utils/adt/nabstime.c b/src/backend/utils/adt/nabstime.c index 20fc55309c..fb17bc13c9 100644 --- a/src/backend/utils/adt/nabstime.c +++ b/src/backend/utils/adt/nabstime.c @@ -10,21 +10,20 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/nabstime.c,v 1.120 2004/05/05 17:28:46 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/nabstime.c,v 1.121 2004/05/21 05:08:02 tgl Exp $ * *------------------------------------------------------------------------- */ #include "postgres.h" #include -#include -#include #include #include #include "access/xact.h" #include "libpq/pqformat.h" #include "miscadmin.h" +#include "pgtime.h" #include "utils/builtins.h" @@ -76,8 +75,8 @@ * Function prototypes -- internal to this file only */ -static AbsoluteTime tm2abstime(struct tm * tm, int tz); -static void reltime2tm(RelativeTime time, struct tm * tm); +static AbsoluteTime tm2abstime(struct pg_tm * tm, int tz); +static void reltime2tm(RelativeTime time, struct pg_tm * tm); static int istinterval(char *i_string, AbsoluteTime *i_start, AbsoluteTime *i_end); @@ -142,10 +141,10 @@ AbsoluteTimeUsecToTimestampTz(AbsoluteTime sec, int usec) /* * GetCurrentDateTime() * - * Get the transaction start time ("now()") broken down as a struct tm. + * Get the transaction start time ("now()") broken down as a struct pg_tm. */ void -GetCurrentDateTime(struct tm * tm) +GetCurrentDateTime(struct pg_tm * tm) { int tz; @@ -155,11 +154,11 @@ GetCurrentDateTime(struct tm * tm) /* * GetCurrentTimeUsec() * - * Get the transaction start time ("now()") broken down as a struct tm, + * Get the transaction start time ("now()") broken down as a struct pg_tm, * including fractional seconds and timezone offset. */ void -GetCurrentTimeUsec(struct tm * tm, fsec_t *fsec, int *tzp) +GetCurrentTimeUsec(struct pg_tm * tm, fsec_t *fsec, int *tzp) { int tz; int usec; @@ -177,10 +176,10 @@ GetCurrentTimeUsec(struct tm * tm, fsec_t *fsec, int *tzp) void -abstime2tm(AbsoluteTime _time, int *tzp, struct tm * tm, char **tzn) +abstime2tm(AbsoluteTime _time, int *tzp, struct pg_tm * tm, char **tzn) { time_t time = (time_t) _time; - struct tm *tx; + struct pg_tm *tx; /* * If HasCTZSet is true then we have a brute force time zone @@ -191,9 +190,9 @@ abstime2tm(AbsoluteTime _time, int *tzp, struct tm * tm, char **tzn) time -= CTimeZone; if ((!HasCTZSet) && (tzp != NULL)) - tx = localtime(&time); + tx = pg_localtime(&time); else - tx = gmtime(&time); + tx = pg_gmtime(&time); tm->tm_year = tx->tm_year + 1900; tm->tm_mon = tx->tm_mon + 1; @@ -203,7 +202,6 @@ abstime2tm(AbsoluteTime _time, int *tzp, struct tm * tm, char **tzn) tm->tm_sec = tx->tm_sec; tm->tm_isdst = tx->tm_isdst; -#if defined(HAVE_TM_ZONE) tm->tm_gmtoff = tx->tm_gmtoff; tm->tm_zone = tx->tm_zone; @@ -248,66 +246,6 @@ abstime2tm(AbsoluteTime _time, int *tzp, struct tm * tm, char **tzn) } else tm->tm_isdst = -1; -#elif defined(HAVE_INT_TIMEZONE) - if (tzp != NULL) - { - /* - * We have a brute force time zone per SQL99? Then use it without - * change since we have already rotated to the time zone. - */ - if (HasCTZSet) - { - *tzp = CTimeZone; - tm->tm_isdst = 0; - if (tzn != NULL) - *tzn = NULL; - } - else - { - *tzp = ((tm->tm_isdst > 0) ? (TIMEZONE_GLOBAL - 3600) : TIMEZONE_GLOBAL); - - if (tzn != NULL) - { - /* - * Copy no more than MAXTZLEN bytes of timezone to tzn, in - * case it contains an error message, which doesn't fit in - * the buffer - */ - StrNCpy(*tzn, tzname[tm->tm_isdst], MAXTZLEN + 1); - if (strlen(tzname[tm->tm_isdst]) > MAXTZLEN) - ereport(WARNING, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("invalid time zone name: \"%s\"", - tzname[tm->tm_isdst]))); - } - } - } - else - tm->tm_isdst = -1; -#else /* not (HAVE_TM_ZONE || HAVE_INT_TIMEZONE) */ - if (tzp != NULL) - { - /* - * We have a brute force time zone per SQL99? Then use it without - * change since we have already rotated to the time zone. - */ - if (HasCTZSet) - { - *tzp = CTimeZone; - if (tzn != NULL) - *tzn = NULL; - } - else - { - /* default to UTC */ - *tzp = 0; - if (tzn != NULL) - *tzn = NULL; - } - } - else - tm->tm_isdst = -1; -#endif } @@ -316,7 +254,7 @@ abstime2tm(AbsoluteTime _time, int *tzp, struct tm * tm, char **tzn) * Note that tm has full year (not 1900-based) and 1-based month. */ static AbsoluteTime -tm2abstime(struct tm * tm, int tz) +tm2abstime(struct pg_tm * tm, int tz) { int day; AbsoluteTime sec; @@ -362,7 +300,7 @@ abstimein(PG_FUNCTION_ARGS) AbsoluteTime result; fsec_t fsec; int tz = 0; - struct tm date, + struct pg_tm date, *tm = &date; int dterr; char *field[MAXDATEFIELDS]; @@ -428,7 +366,7 @@ abstimeout(PG_FUNCTION_ARGS) char *result; int tz; double fsec = 0; - struct tm tt, + struct pg_tm tt, *tm = &tt; char buf[MAXDATELEN + 1]; char zone[MAXDATELEN + 1], @@ -611,7 +549,7 @@ timestamp_abstime(PG_FUNCTION_ARGS) AbsoluteTime result; fsec_t fsec; int tz; - struct tm tt, + struct pg_tm tt, *tm = &tt; if (TIMESTAMP_IS_NOBEGIN(timestamp)) @@ -642,7 +580,7 @@ abstime_timestamp(PG_FUNCTION_ARGS) { AbsoluteTime abstime = PG_GETARG_ABSOLUTETIME(0); Timestamp result; - struct tm tt, + struct pg_tm tt, *tm = &tt; int tz; char zone[MAXDATELEN + 1], @@ -687,7 +625,7 @@ timestamptz_abstime(PG_FUNCTION_ARGS) TimestampTz timestamp = PG_GETARG_TIMESTAMP(0); AbsoluteTime result; fsec_t fsec; - struct tm tt, + struct pg_tm tt, *tm = &tt; if (TIMESTAMP_IS_NOBEGIN(timestamp)) @@ -715,7 +653,7 @@ abstime_timestamptz(PG_FUNCTION_ARGS) { AbsoluteTime abstime = PG_GETARG_ABSOLUTETIME(0); TimestampTz result; - struct tm tt, + struct pg_tm tt, *tm = &tt; int tz; char zone[MAXDATELEN + 1], @@ -763,7 +701,7 @@ reltimein(PG_FUNCTION_ARGS) { char *str = PG_GETARG_CSTRING(0); RelativeTime result; - struct tm tt, + struct pg_tm tt, *tm = &tt; fsec_t fsec; int dtype; @@ -811,7 +749,7 @@ reltimeout(PG_FUNCTION_ARGS) { RelativeTime time = PG_GETARG_RELATIVETIME(0); char *result; - struct tm tt, + struct pg_tm tt, *tm = &tt; char buf[MAXDATELEN + 1]; @@ -849,7 +787,7 @@ reltimesend(PG_FUNCTION_ARGS) static void -reltime2tm(RelativeTime time, struct tm * tm) +reltime2tm(RelativeTime time, struct pg_tm * tm) { double dtime = time; @@ -1732,8 +1670,8 @@ timeofday(PG_FUNCTION_ARGS) gettimeofday(&tp, &tpz); tt = (time_t) tp.tv_sec; - strftime(templ, sizeof(templ), "%a %b %d %H:%M:%S.%%06d %Y %Z", - localtime(&tt)); + pg_strftime(templ, sizeof(templ), "%a %b %d %H:%M:%S.%%06d %Y %Z", + pg_localtime(&tt)); snprintf(buf, sizeof(buf), templ, tp.tv_usec); len = VARHDRSZ + strlen(buf); diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index cd59b7f34a..1705441329 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.105 2004/05/07 00:24:58 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.106 2004/05/21 05:08:02 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -70,7 +70,7 @@ timestamp_in(PG_FUNCTION_ARGS) int32 typmod = PG_GETARG_INT32(2); Timestamp result; fsec_t fsec; - struct tm tt, + struct pg_tm tt, *tm = &tt; int tz; int dtype; @@ -137,7 +137,7 @@ timestamp_out(PG_FUNCTION_ARGS) { Timestamp timestamp = PG_GETARG_TIMESTAMP(0); char *result; - struct tm tt, + struct pg_tm tt, *tm = &tt; fsec_t fsec; char *tzn = NULL; @@ -296,7 +296,7 @@ timestamptz_in(PG_FUNCTION_ARGS) int32 typmod = PG_GETARG_INT32(2); TimestampTz result; fsec_t fsec; - struct tm tt, + struct pg_tm tt, *tm = &tt; int tz; int dtype; @@ -364,7 +364,7 @@ timestamptz_out(PG_FUNCTION_ARGS) TimestampTz dt = PG_GETARG_TIMESTAMPTZ(0); char *result; int tz; - struct tm tt, + struct pg_tm tt, *tm = &tt; fsec_t fsec; char *tzn; @@ -456,7 +456,7 @@ interval_in(PG_FUNCTION_ARGS) int32 typmod = PG_GETARG_INT32(2); Interval *result; fsec_t fsec; - struct tm tt, + struct pg_tm tt, *tm = &tt; int dtype; int nf; @@ -520,7 +520,7 @@ interval_out(PG_FUNCTION_ARGS) { Interval *span = PG_GETARG_INTERVAL_P(0); char *result; - struct tm tt, + struct pg_tm tt, *tm = &tt; fsec_t fsec; char buf[MAXDATELEN + 1]; @@ -933,23 +933,19 @@ dt2time(Timestamp jd, int *hour, int *min, int *sec, fsec_t *fsec) * local time zone. If out of this range, leave as GMT. - tgl 97/05/27 */ int -timestamp2tm(Timestamp dt, int *tzp, struct tm * tm, fsec_t *fsec, char **tzn) +timestamp2tm(Timestamp dt, int *tzp, struct pg_tm * tm, fsec_t *fsec, char **tzn) { #ifdef HAVE_INT64_TIMESTAMP int date, date0; int64 time; - #else double date, date0; double time; #endif time_t utime; - -#if defined(HAVE_TM_ZONE) || defined(HAVE_INT_TIMEZONE) - struct tm *tx; -#endif + struct pg_tm *tx; date0 = POSTGRES_EPOCH_JDATE; @@ -1006,10 +1002,8 @@ timestamp2tm(Timestamp dt, int *tzp, struct tm * tm, fsec_t *fsec, char **tzn) { *tzp = CTimeZone; tm->tm_isdst = 0; -#if defined(HAVE_TM_ZONE) tm->tm_gmtoff = CTimeZone; tm->tm_zone = NULL; -#endif if (tzn != NULL) *tzn = NULL; } @@ -1027,46 +1021,20 @@ timestamp2tm(Timestamp dt, int *tzp, struct tm * tm, fsec_t *fsec, char **tzn) utime = (dt + ((date0 - UNIX_EPOCH_JDATE) * 86400)); #endif -#if defined(HAVE_TM_ZONE) || defined(HAVE_INT_TIMEZONE) - tx = localtime(&utime); + tx = pg_localtime(&utime); tm->tm_year = tx->tm_year + 1900; tm->tm_mon = tx->tm_mon + 1; tm->tm_mday = tx->tm_mday; tm->tm_hour = tx->tm_hour; tm->tm_min = tx->tm_min; -#if NOT_USED -/* XXX HACK - * Argh! My Linux box puts in a 1 second offset for dates less than 1970 - * but only if the seconds field was non-zero. So, don't copy the seconds - * field and instead carry forward from the original - thomas 97/06/18 - * Note that Linux uses the standard freeware zic package as do - * many other platforms so this may not be Linux/ix86-specific. - * Still shows a problem on my up to date Linux box - thomas 2001-01-17 - */ tm->tm_sec = tx->tm_sec; -#endif tm->tm_isdst = tx->tm_isdst; - -#if defined(HAVE_TM_ZONE) tm->tm_gmtoff = tx->tm_gmtoff; tm->tm_zone = tx->tm_zone; - *tzp = -(tm->tm_gmtoff); /* tm_gmtoff is Sun/DEC-ism */ + *tzp = -(tm->tm_gmtoff); if (tzn != NULL) *tzn = (char *) tm->tm_zone; -#elif defined(HAVE_INT_TIMEZONE) - *tzp = ((tm->tm_isdst > 0) ? (TIMEZONE_GLOBAL - 3600) : TIMEZONE_GLOBAL); - if (tzn != NULL) - *tzn = tzname[(tm->tm_isdst > 0)]; -#endif - -#else /* not (HAVE_TM_ZONE || HAVE_INT_TIMEZONE) */ - *tzp = 0; - /* Mark this as *no* time zone available */ - tm->tm_isdst = -1; - if (tzn != NULL) - *tzn = NULL; -#endif } else { @@ -1096,12 +1064,11 @@ timestamp2tm(Timestamp dt, int *tzp, struct tm * tm, fsec_t *fsec, char **tzn) * Returns -1 on failure (value out of range). */ int -tm2timestamp(struct tm * tm, fsec_t fsec, int *tzp, Timestamp *result) +tm2timestamp(struct pg_tm * tm, fsec_t fsec, int *tzp, Timestamp *result) { #ifdef HAVE_INT64_TIMESTAMP int date; int64 time; - #else double date, time; @@ -1135,11 +1102,10 @@ tm2timestamp(struct tm * tm, fsec_t fsec, int *tzp, Timestamp *result) * Convert a interval data type to a tm structure. */ int -interval2tm(Interval span, struct tm * tm, fsec_t *fsec) +interval2tm(Interval span, struct pg_tm * tm, fsec_t *fsec) { #ifdef HAVE_INT64_TIMESTAMP int64 time; - #else double time; #endif @@ -1179,7 +1145,7 @@ interval2tm(Interval span, struct tm * tm, fsec_t *fsec) } int -tm2interval(struct tm * tm, fsec_t fsec, Interval *span) +tm2interval(struct pg_tm * tm, fsec_t fsec, Interval *span) { span->month = ((tm->tm_year * 12) + tm->tm_mon); #ifdef HAVE_INT64_TIMESTAMP @@ -1251,12 +1217,12 @@ interval_finite(PG_FUNCTION_ARGS) *---------------------------------------------------------*/ void -GetEpochTime(struct tm * tm) +GetEpochTime(struct pg_tm * tm) { - struct tm *t0; + struct pg_tm *t0; time_t epoch = 0; - t0 = gmtime(&epoch); + t0 = pg_gmtime(&epoch); tm->tm_year = t0->tm_year; tm->tm_mon = t0->tm_mon; @@ -1276,7 +1242,7 @@ Timestamp SetEpochTimestamp(void) { Timestamp dt; - struct tm tt, + struct pg_tm tt, *tm = &tt; GetEpochTime(tm); @@ -1896,7 +1862,7 @@ timestamp_pl_interval(PG_FUNCTION_ARGS) { if (span->month != 0) { - struct tm tt, + struct pg_tm tt, *tm = &tt; fsec_t fsec; @@ -1974,7 +1940,7 @@ timestamptz_pl_interval(PG_FUNCTION_ARGS) { if (span->month != 0) { - struct tm tt, + struct pg_tm tt, *tm = &tt; fsec_t fsec; @@ -2296,11 +2262,11 @@ timestamp_age(PG_FUNCTION_ARGS) fsec_t fsec, fsec1, fsec2; - struct tm tt, + struct pg_tm tt, *tm = &tt; - struct tm tt1, + struct pg_tm tt1, *tm1 = &tt1; - struct tm tt2, + struct pg_tm tt2, *tm2 = &tt2; result = (Interval *) palloc(sizeof(Interval)); @@ -2407,11 +2373,11 @@ timestamptz_age(PG_FUNCTION_ARGS) fsec_t fsec, fsec1, fsec2; - struct tm tt, + struct pg_tm tt, *tm = &tt; - struct tm tt1, + struct pg_tm tt1, *tm1 = &tt1; - struct tm tt2, + struct pg_tm tt2, *tm2 = &tt2; result = (Interval *) palloc(sizeof(Interval)); @@ -2702,7 +2668,7 @@ timestamp_trunc(PG_FUNCTION_ARGS) val; char *lowunits; fsec_t fsec; - struct tm tt, + struct pg_tm tt, *tm = &tt; if (TIMESTAMP_NOT_FINITE(timestamp)) @@ -2806,7 +2772,7 @@ timestamptz_trunc(PG_FUNCTION_ARGS) char *lowunits; fsec_t fsec; char *tzn; - struct tm tt, + struct pg_tm tt, *tm = &tt; if (TIMESTAMP_NOT_FINITE(timestamp)) @@ -2909,7 +2875,7 @@ interval_trunc(PG_FUNCTION_ARGS) val; char *lowunits; fsec_t fsec; - struct tm tt, + struct pg_tm tt, *tm = &tt; result = (Interval *) palloc(sizeof(Interval)); @@ -3142,7 +3108,7 @@ timestamp_part(PG_FUNCTION_ARGS) val; char *lowunits; fsec_t fsec; - struct tm tt, + struct pg_tm tt, *tm = &tt; if (TIMESTAMP_NOT_FINITE(timestamp)) @@ -3355,7 +3321,7 @@ timestamptz_part(PG_FUNCTION_ARGS) double dummy; fsec_t fsec; char *tzn; - struct tm tt, + struct pg_tm tt, *tm = &tt; if (TIMESTAMP_NOT_FINITE(timestamp)) @@ -3544,7 +3510,7 @@ interval_part(PG_FUNCTION_ARGS) val; char *lowunits; fsec_t fsec; - struct tm tt, + struct pg_tm tt, *tm = &tt; lowunits = downcase_truncate_identifier(VARDATA(units), @@ -3755,7 +3721,7 @@ static TimestampTz timestamp2timestamptz(Timestamp timestamp) { TimestampTz result; - struct tm tt, + struct pg_tm tt, *tm = &tt; fsec_t fsec; int tz; @@ -3788,7 +3754,7 @@ timestamptz_timestamp(PG_FUNCTION_ARGS) { TimestampTz timestamp = PG_GETARG_TIMESTAMPTZ(0); Timestamp result; - struct tm tt, + struct pg_tm tt, *tm = &tt; fsec_t fsec; char *tzn; diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index 012842b61d..d7e5a98376 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -37,18 +37,16 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.136 2004/05/07 00:24:58 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/error/elog.c,v 1.137 2004/05/21 05:08:02 tgl Exp $ * *------------------------------------------------------------------------- */ #include "postgres.h" -#include #include #include #include #include -#include #include #ifdef HAVE_SYSLOG #include @@ -58,6 +56,7 @@ #include "libpq/pqformat.h" #include "mb/pg_wchar.h" #include "miscadmin.h" +#include "pgtime.h" #include "storage/ipc.h" #include "tcop/tcopprot.h" #include "utils/memutils.h" @@ -1217,8 +1216,8 @@ log_line_prefix(StringInfo buf) time_t stamp_time = time(NULL); char strfbuf[128]; - strftime(strfbuf, sizeof(strfbuf), "%Y-%m-%d %H:%M:%S %Z", - localtime(&stamp_time)); + pg_strftime(strfbuf, sizeof(strfbuf), "%Y-%m-%d %H:%M:%S %Z", + pg_localtime(&stamp_time)); appendStringInfoString(buf, strfbuf); } break; @@ -1228,8 +1227,8 @@ log_line_prefix(StringInfo buf) time_t stamp_time = MyProcPort->session_start.tv_sec; char strfbuf[128]; - strftime(strfbuf, sizeof(strfbuf), "%Y-%m-%d %H:%M:%S %Z", - localtime(&stamp_time)); + pg_strftime(strfbuf, sizeof(strfbuf), "%Y-%m-%d %H:%M:%S %Z", + pg_localtime(&stamp_time)); appendStringInfoString(buf, strfbuf); } break; diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index f59e872f57..8a51e8aa04 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -10,7 +10,7 @@ * Written by Peter Eisentraut . * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.205 2004/05/08 02:11:46 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.206 2004/05/21 05:08:03 tgl Exp $ * *-------------------------------------------------------------------- */ @@ -2094,10 +2094,6 @@ InitializeGUCOptions(void) if (env != NULL) SetConfigOption("datestyle", env, PGC_POSTMASTER, PGC_S_ENV_VAR); - env = getenv("TZ"); - if (env != NULL) - SetConfigOption("timezone", env, PGC_POSTMASTER, PGC_S_ENV_VAR); - env = getenv("PGCLIENTENCODING"); if (env != NULL) SetConfigOption("client_encoding", env, PGC_POSTMASTER, PGC_S_ENV_VAR); diff --git a/src/include/c.h b/src/include/c.h index d607677aa3..17ec1855e1 100644 --- a/src/include/c.h +++ b/src/include/c.h @@ -12,7 +12,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/c.h,v 1.164 2004/05/07 00:24:58 tgl Exp $ + * $PostgreSQL: pgsql/src/include/c.h,v 1.165 2004/05/21 05:08:03 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -309,18 +309,6 @@ typedef unsigned long int uint64; #define HAVE_INT64_TIMESTAMP #endif -/* Global variable holding time zone information. */ -#if defined(USE_PGTZ) && !defined(FRONTEND) -#define TIMEZONE_GLOBAL pg_timezone -#else -#ifndef HAVE_UNDERSCORE_TIMEZONE -#define TIMEZONE_GLOBAL timezone -#else -#define TIMEZONE_GLOBAL _timezone -#define tzname _tzname /* should be in time.h? */ -#endif -#endif - /* sig_atomic_t is required by ANSI C, but may be missing on old platforms */ #ifndef HAVE_SIG_ATOMIC_T typedef int sig_atomic_t; diff --git a/src/include/catalog/pg_control.h b/src/include/catalog/pg_control.h index 8bc6e94d4d..a4aba75985 100644 --- a/src/include/catalog/pg_control.h +++ b/src/include/catalog/pg_control.h @@ -8,16 +8,15 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/catalog/pg_control.h,v 1.13 2004/02/11 22:55:26 tgl Exp $ + * $PostgreSQL: pgsql/src/include/catalog/pg_control.h,v 1.14 2004/05/21 05:08:04 tgl Exp $ * *------------------------------------------------------------------------- */ #ifndef PG_CONTROL_H #define PG_CONTROL_H -#include - #include "access/xlogdefs.h" +#include "pgtime.h" #include "utils/pg_crc.h" diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index 9abb09948f..a39e90a4a1 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -7,16 +7,13 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/commands/vacuum.h,v 1.51 2004/02/15 21:01:39 tgl Exp $ + * $PostgreSQL: pgsql/src/include/commands/vacuum.h,v 1.52 2004/05/21 05:08:04 tgl Exp $ * *------------------------------------------------------------------------- */ #ifndef VACUUM_H #define VACUUM_H -#include -#include - #ifdef HAVE_GETRUSAGE #include #else @@ -28,6 +25,7 @@ #include "catalog/pg_statistic.h" #include "catalog/pg_type.h" #include "nodes/parsenodes.h" +#include "pgtime.h" #include "utils/rel.h" diff --git a/src/include/libpq/libpq-be.h b/src/include/libpq/libpq-be.h index 718001c9b3..45fc5bd76b 100644 --- a/src/include/libpq/libpq-be.h +++ b/src/include/libpq/libpq-be.h @@ -11,16 +11,15 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/libpq/libpq-be.h,v 1.44 2004/04/05 03:16:21 momjian Exp $ + * $PostgreSQL: pgsql/src/include/libpq/libpq-be.h,v 1.45 2004/05/21 05:08:04 tgl Exp $ * *------------------------------------------------------------------------- */ #ifndef LIBPQ_BE_H #define LIBPQ_BE_H -#ifndef _MSC_VER #include -#endif + #ifdef USE_SSL #include #include diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index e8158a678a..69aee085f8 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -615,9 +615,6 @@ /* Define to 1 to build with PAM support. (--with-pam) */ #undef USE_PAM -/* Define to 1 to use our own timezone library */ -#undef USE_PGTZ - /* Define to 1 to build with Rendezvous support. (--with-rendezvous) */ #undef USE_RENDEZVOUS diff --git a/src/include/pg_config_manual.h b/src/include/pg_config_manual.h index 87ddd1f196..85e99950af 100644 --- a/src/include/pg_config_manual.h +++ b/src/include/pg_config_manual.h @@ -6,7 +6,7 @@ * for developers. If you edit any of these, be sure to do a *full* * rebuild (and an initdb if noted). * - * $PostgreSQL: pgsql/src/include/pg_config_manual.h,v 1.12 2004/03/24 22:40:29 tgl Exp $ + * $PostgreSQL: pgsql/src/include/pg_config_manual.h,v 1.13 2004/05/21 05:08:03 tgl Exp $ *------------------------------------------------------------------------ */ @@ -152,14 +152,6 @@ #define HAVE_WORKING_LINK 1 #endif -/* - * Define this if your operating system has _timezone rather than timezone - */ -#if defined(__CYGWIN__) || defined(WIN32) -#define HAVE_INT_TIMEZONE /* has int _timezone */ -#define HAVE_UNDERSCORE_TIMEZONE 1 -#endif - /* * This is the default directory in which AF_UNIX socket files are * placed. Caution: changing this risks breaking your existing client diff --git a/src/include/pgtime.h b/src/include/pgtime.h new file mode 100644 index 0000000000..8493c8c6f7 --- /dev/null +++ b/src/include/pgtime.h @@ -0,0 +1,73 @@ +/*------------------------------------------------------------------------- + * + * pgtime.h + * PostgreSQL internal timezone library + * + * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group + * + * IDENTIFICATION + * $PostgreSQL: pgsql/src/include/pgtime.h,v 1.1 2004/05/21 05:08:03 tgl Exp $ + * + *------------------------------------------------------------------------- + */ +#ifndef _PGTIME_H +#define _PGTIME_H + +#ifdef FRONTEND + +/* Don't mess with anything for the frontends */ +#include + +#else + +/* + * Redefine functions and defines we implement, so we cause an + * error if someone tries to use the "base functions" + */ +#ifndef NO_REDEFINE_TIMEFUNCS +#define localtime DONOTUSETHIS_localtime +#define gmtime DONOTUSETHIS_gmtime +#define asctime DONOTUSETHIS_asctime +#define ctime DONOTUSETHIS_ctime +#define tzset DONOTUSETHIS_tzset +#define mktime DONOTUSETHIS_mktime +#define tzname DONOTUSETHIS_tzname +#define daylight DONOTUSETHIS_daylight +#define strftime DONOTUSETHIS_strftime +#endif + +/* Then pull in default declarations, particularly time_t */ +#include + +/* + * Now define prototype for our own timezone implementation + * structs and functions. + */ +struct pg_tm { + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; + long int tm_gmtoff; + const char *tm_zone; +}; + +extern struct pg_tm *pg_localtime(const time_t *); +extern struct pg_tm *pg_gmtime(const time_t *); +extern time_t pg_mktime(struct pg_tm *); +extern bool pg_tzset(const char *tzname); +extern size_t pg_strftime(char *s, size_t max, const char *format, + const struct pg_tm *tm); +extern void pg_timezone_initialize(void); +extern bool tz_acceptable(void); +extern const char *select_default_timezone(void); +extern const char *pg_get_current_timezone(void); + +#endif /* FRONTEND */ + +#endif /* _PGTIME_H */ diff --git a/src/include/port.h b/src/include/port.h index 65702b911b..3c98955177 100644 --- a/src/include/port.h +++ b/src/include/port.h @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/port.h,v 1.35 2004/05/20 15:38:11 momjian Exp $ + * $PostgreSQL: pgsql/src/include/port.h,v 1.36 2004/05/21 05:08:03 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -220,37 +220,3 @@ extern int pqGethostbyname(const char *name, #define WIFSIGNALED(w) (((w) & 0x7f) > 0 && (((w) & 0x7f) < 0x7f)) #define WTERMSIG(w) ((w) & 0x7f) #endif - -/* - * Internal timezone library - */ -#ifdef USE_PGTZ -#ifndef FRONTEND -#undef localtime -#undef gmtime -#undef asctime -#undef ctime -#undef difftime -#undef mktime -#undef tzset - -#define localtime(timep) pg_localtime(timep) -#define gmtime(timep) pg_gmtime(timep) -#define asctime(timep) pg_asctime(timep) -#define ctime(timep) pg_ctime(timep) -#define difftime(t1,t2) pg_difftime(t1,t2) -#define mktime(tm) pg_mktime(tm) -#define tzset pg_tzset - - -extern struct tm *pg_localtime(const time_t *); -extern struct tm *pg_gmtime(const time_t *); -extern char *pg_asctime(const struct tm *); -extern char *pg_ctime(const time_t *); -extern double pg_difftime(const time_t, const time_t); -extern time_t pg_mktime(struct tm *); -extern void pg_tzset(void); -extern time_t pg_timezone; - -#endif -#endif diff --git a/src/include/utils/datetime.h b/src/include/utils/datetime.h index 34a98454ac..35eec95eeb 100644 --- a/src/include/utils/datetime.h +++ b/src/include/utils/datetime.h @@ -9,7 +9,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/utils/datetime.h,v 1.47 2004/01/19 19:04:40 tgl Exp $ + * $PostgreSQL: pgsql/src/include/utils/datetime.h,v 1.48 2004/05/21 05:08:05 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -18,8 +18,8 @@ #include #include -#include +#include "pgtime.h" #include "utils/timestamp.h" @@ -289,8 +289,8 @@ extern int day_tab[2][13]; #define DTERR_TZDISP_OVERFLOW (-5) -extern void GetCurrentDateTime(struct tm * tm); -extern void GetCurrentTimeUsec(struct tm * tm, fsec_t *fsec, int *tzp); +extern void GetCurrentDateTime(struct pg_tm * tm); +extern void GetCurrentTimeUsec(struct pg_tm * tm, fsec_t *fsec, int *tzp); extern void j2date(int jd, int *year, int *month, int *day); extern int date2j(int year, int month, int day); @@ -299,30 +299,28 @@ extern int ParseDateTime(const char *timestr, char *lowstr, int maxfields, int *numfields); extern int DecodeDateTime(char **field, int *ftype, int nf, int *dtype, - struct tm * tm, fsec_t *fsec, int *tzp); + struct pg_tm * tm, fsec_t *fsec, int *tzp); extern int DecodeTimeOnly(char **field, int *ftype, int nf, int *dtype, - struct tm * tm, fsec_t *fsec, int *tzp); + struct pg_tm * tm, fsec_t *fsec, int *tzp); extern int DecodeInterval(char **field, int *ftype, int nf, int *dtype, - struct tm * tm, fsec_t *fsec); + struct pg_tm * tm, fsec_t *fsec); extern void DateTimeParseError(int dterr, const char *str, const char *datatype); -extern int DetermineLocalTimeZone(struct tm * tm); +extern int DetermineLocalTimeZone(struct pg_tm * tm); -extern int EncodeDateOnly(struct tm * tm, int style, char *str); -extern int EncodeTimeOnly(struct tm * tm, fsec_t fsec, int *tzp, int style, char *str); -extern int EncodeDateTime(struct tm * tm, fsec_t fsec, int *tzp, char **tzn, int style, char *str); -extern int EncodeInterval(struct tm * tm, fsec_t fsec, int style, char *str); +extern int EncodeDateOnly(struct pg_tm * tm, int style, char *str); +extern int EncodeTimeOnly(struct pg_tm * tm, fsec_t fsec, int *tzp, int style, char *str); +extern int EncodeDateTime(struct pg_tm * tm, fsec_t fsec, int *tzp, char **tzn, int style, char *str); +extern int EncodeInterval(struct pg_tm * tm, fsec_t fsec, int style, char *str); extern int DecodeSpecial(int field, char *lowtoken, int *val); extern int DecodeUnits(int field, char *lowtoken, int *val); extern int j2day(int jd); -extern int DecodePosixTimezone(char *str, int *tzp); - extern bool CheckDateTokenTables(void); #endif /* DATETIME_H */ diff --git a/src/include/utils/nabstime.h b/src/include/utils/nabstime.h index dff548bc22..704e7de583 100644 --- a/src/include/utils/nabstime.h +++ b/src/include/utils/nabstime.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/utils/nabstime.h,v 1.41 2003/11/29 22:41:15 pgsql Exp $ + * $PostgreSQL: pgsql/src/include/utils/nabstime.h,v 1.42 2004/05/21 05:08:05 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -15,9 +15,9 @@ #define NABSTIME_H #include -#include #include "fmgr.h" +#include "pgtime.h" #include "utils/timestamp.h" #include "utils/datetime.h" @@ -164,6 +164,6 @@ extern Datum timeofday(PG_FUNCTION_ARGS); extern AbsoluteTime GetCurrentAbsoluteTime(void); extern AbsoluteTime GetCurrentAbsoluteTimeUsec(int *usec); extern TimestampTz AbsoluteTimeUsecToTimestampTz(AbsoluteTime sec, int usec); -extern void abstime2tm(AbsoluteTime time, int *tzp, struct tm * tm, char **tzn); +extern void abstime2tm(AbsoluteTime time, int *tzp, struct pg_tm * tm, char **tzn); #endif /* NABSTIME_H */ diff --git a/src/include/utils/timestamp.h b/src/include/utils/timestamp.h index d514114ef9..32de318f94 100644 --- a/src/include/utils/timestamp.h +++ b/src/include/utils/timestamp.h @@ -6,19 +6,19 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/utils/timestamp.h,v 1.36 2004/05/01 19:25:08 momjian Exp $ + * $PostgreSQL: pgsql/src/include/utils/timestamp.h,v 1.37 2004/05/21 05:08:05 tgl Exp $ * *------------------------------------------------------------------------- */ #ifndef TIMESTAMP_H #define TIMESTAMP_H -#include #include #include #include #include "fmgr.h" +#include "pgtime.h" #ifdef HAVE_INT64_TIMESTAMP #include "utils/int8.h" #endif @@ -251,16 +251,16 @@ extern Datum now(PG_FUNCTION_ARGS); /* Internal routines (not fmgr-callable) */ -extern int tm2timestamp(struct tm * tm, fsec_t fsec, int *tzp, Timestamp *dt); -extern int timestamp2tm(Timestamp dt, int *tzp, struct tm * tm, +extern int tm2timestamp(struct pg_tm * tm, fsec_t fsec, int *tzp, Timestamp *dt); +extern int timestamp2tm(Timestamp dt, int *tzp, struct pg_tm * tm, fsec_t *fsec, char **tzn); extern void dt2time(Timestamp dt, int *hour, int *min, int *sec, fsec_t *fsec); -extern int interval2tm(Interval span, struct tm * tm, fsec_t *fsec); -extern int tm2interval(struct tm * tm, fsec_t fsec, Interval *span); +extern int interval2tm(Interval span, struct pg_tm * tm, fsec_t *fsec); +extern int tm2interval(struct pg_tm * tm, fsec_t fsec, Interval *span); extern Timestamp SetEpochTimestamp(void); -extern void GetEpochTime(struct tm * tm); +extern void GetEpochTime(struct pg_tm * tm); extern int timestamp_cmp_internal(Timestamp dt1, Timestamp dt2); /* timestamp comparison works for timestamptz also */ diff --git a/src/port/gettimeofday.c b/src/port/gettimeofday.c index b7eb92a271..fd4200d04d 100644 --- a/src/port/gettimeofday.c +++ b/src/port/gettimeofday.c @@ -1,5 +1,5 @@ /* - * $PostgreSQL: pgsql/src/port/gettimeofday.c,v 1.3 2003/11/29 19:52:13 pgsql Exp $ + * $PostgreSQL: pgsql/src/port/gettimeofday.c,v 1.4 2004/05/21 05:08:05 tgl Exp $ * * Copyright (c) 2003 SRA, Inc. * Copyright (c) 2003 SKC, Inc. @@ -25,7 +25,8 @@ #include "postgres.h" -#include "sys/time.h" +#include + /* FILETIME of Jan 1 1970 00:00:00. */ static const unsigned __int64 epoch = 116444736000000000L; diff --git a/src/test/regress/expected/abstime-solaris-1947.out b/src/test/regress/expected/abstime-solaris-1947.out deleted file mode 100644 index 353580bf7b..0000000000 --- a/src/test/regress/expected/abstime-solaris-1947.out +++ /dev/null @@ -1,130 +0,0 @@ --- --- ABSTIME --- testing built-in time type abstime --- uses reltime and tinterval --- --- --- timezones may vary based not only on location but the operating --- system. the main correctness issue is that the OS may not get --- daylight savings time right for times prior to Unix epoch (jan 1 1970). --- -CREATE TABLE ABSTIME_TBL (f1 abstime); -BEGIN; -INSERT INTO ABSTIME_TBL (f1) VALUES (abstime 'now'); -INSERT INTO ABSTIME_TBL (f1) VALUES (abstime 'now'); -SELECT count(*) AS two FROM ABSTIME_TBL WHERE f1 = 'now' ; - two ------ - 2 -(1 row) - -END; -DELETE FROM ABSTIME_TBL; -INSERT INTO ABSTIME_TBL (f1) VALUES ('Jan 14, 1973 03:14:21'); -INSERT INTO ABSTIME_TBL (f1) VALUES (abstime 'Mon May 1 00:30:30 1995'); -INSERT INTO ABSTIME_TBL (f1) VALUES (abstime 'epoch'); -INSERT INTO ABSTIME_TBL (f1) VALUES (abstime 'infinity'); -INSERT INTO ABSTIME_TBL (f1) VALUES (abstime '-infinity'); -INSERT INTO ABSTIME_TBL (f1) VALUES (abstime 'May 10, 1947 23:59:12'); --- what happens if we specify slightly misformatted abstime? -INSERT INTO ABSTIME_TBL (f1) VALUES ('Feb 35, 1946 10:00:00'); -ERROR: date/time field value out of range: "Feb 35, 1946 10:00:00" -HINT: Perhaps you need a different "datestyle" setting. -INSERT INTO ABSTIME_TBL (f1) VALUES ('Feb 28, 1984 25:08:10'); -ERROR: date/time field value out of range: "Feb 28, 1984 25:08:10" --- badly formatted abstimes: these should result in invalid abstimes -INSERT INTO ABSTIME_TBL (f1) VALUES ('bad date format'); -ERROR: invalid input syntax for type abstime: "bad date format" -INSERT INTO ABSTIME_TBL (f1) VALUES ('Jun 10, 1843'); --- test abstime operators -SELECT '' AS eight, ABSTIME_TBL.*; - eight | f1 --------+------------------------------ - | Sun Jan 14 03:14:21 1973 PST - | Mon May 01 00:30:30 1995 PDT - | Wed Dec 31 16:00:00 1969 PST - | infinity - | -infinity - | Sat May 10 23:59:12 1947 PDT - | invalid -(7 rows) - -SELECT '' AS six, ABSTIME_TBL.* - WHERE ABSTIME_TBL.f1 < abstime 'Jun 30, 2001'; - six | f1 ------+------------------------------ - | Sun Jan 14 03:14:21 1973 PST - | Mon May 01 00:30:30 1995 PDT - | Wed Dec 31 16:00:00 1969 PST - | -infinity - | Sat May 10 23:59:12 1947 PDT -(5 rows) - -SELECT '' AS six, ABSTIME_TBL.* - WHERE ABSTIME_TBL.f1 > abstime '-infinity'; - six | f1 ------+------------------------------ - | Sun Jan 14 03:14:21 1973 PST - | Mon May 01 00:30:30 1995 PDT - | Wed Dec 31 16:00:00 1969 PST - | infinity - | Sat May 10 23:59:12 1947 PDT - | invalid -(6 rows) - -SELECT '' AS six, ABSTIME_TBL.* - WHERE abstime 'May 10, 1947 23:59:12' <> ABSTIME_TBL.f1; - six | f1 ------+------------------------------ - | Sun Jan 14 03:14:21 1973 PST - | Mon May 01 00:30:30 1995 PDT - | Wed Dec 31 16:00:00 1969 PST - | infinity - | -infinity - | invalid -(6 rows) - -SELECT '' AS three, ABSTIME_TBL.* - WHERE abstime 'epoch' >= ABSTIME_TBL.f1; - three | f1 --------+------------------------------ - | Wed Dec 31 16:00:00 1969 PST - | -infinity - | Sat May 10 23:59:12 1947 PDT -(3 rows) - -SELECT '' AS four, ABSTIME_TBL.* - WHERE ABSTIME_TBL.f1 <= abstime 'Jan 14, 1973 03:14:21'; - four | f1 -------+------------------------------ - | Sun Jan 14 03:14:21 1973 PST - | Wed Dec 31 16:00:00 1969 PST - | -infinity - | Sat May 10 23:59:12 1947 PDT -(4 rows) - -SELECT '' AS four, ABSTIME_TBL.* - WHERE ABSTIME_TBL.f1 - tinterval '["Apr 1 1950 00:00:00" "Dec 30 1999 23:00:00"]'; - four | f1 -------+------------------------------ - | Sun Jan 14 03:14:21 1973 PST - | Mon May 01 00:30:30 1995 PDT - | Wed Dec 31 16:00:00 1969 PST -(3 rows) - -SELECT '' AS four, f1 AS abstime, - date_part('year', f1) AS year, date_part('month', f1) AS month, - date_part('day',f1) AS day, date_part('hour', f1) AS hour, - date_part('minute', f1) AS minute, date_part('second', f1) AS second - FROM ABSTIME_TBL - WHERE isfinite(f1) - ORDER BY abstime; - four | abstime | year | month | day | hour | minute | second -------+------------------------------+------+-------+-----+------+--------+-------- - | Sat May 10 23:59:12 1947 PDT | 1947 | 5 | 10 | 23 | 59 | 12 - | Wed Dec 31 16:00:00 1969 PST | 1969 | 12 | 31 | 16 | 0 | 0 - | Sun Jan 14 03:14:21 1973 PST | 1973 | 1 | 14 | 3 | 14 | 21 - | Mon May 01 00:30:30 1995 PDT | 1995 | 5 | 1 | 0 | 30 | 30 -(4 rows) - diff --git a/src/test/regress/expected/horology-no-DST-before-1970.out b/src/test/regress/expected/horology-no-DST-before-1970.out deleted file mode 100644 index cf954867a3..0000000000 --- a/src/test/regress/expected/horology-no-DST-before-1970.out +++ /dev/null @@ -1,2924 +0,0 @@ --- --- HOROLOGY --- --- needed so tests pass even in Australia -SET australian_timezones = 'off'; -SET DateStyle = 'Postgres, MDY'; --- --- Test various input formats --- -SELECT timestamp with time zone '20011227 040506+08'; - timestamptz ------------------------------- - Wed Dec 26 12:05:06 2001 PST -(1 row) - -SELECT timestamp with time zone '20011227 040506-08'; - timestamptz ------------------------------- - Thu Dec 27 04:05:06 2001 PST -(1 row) - -SELECT timestamp with time zone '20011227 040506.789+08'; - timestamptz ----------------------------------- - Wed Dec 26 12:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone '20011227 040506.789-08'; - timestamptz ----------------------------------- - Thu Dec 27 04:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone '20011227T040506+08'; - timestamptz ------------------------------- - Wed Dec 26 12:05:06 2001 PST -(1 row) - -SELECT timestamp with time zone '20011227T040506-08'; - timestamptz ------------------------------- - Thu Dec 27 04:05:06 2001 PST -(1 row) - -SELECT timestamp with time zone '20011227T040506.789+08'; - timestamptz ----------------------------------- - Wed Dec 26 12:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone '20011227T040506.789-08'; - timestamptz ----------------------------------- - Thu Dec 27 04:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone '2001-12-27 04:05:06.789-08'; - timestamptz ----------------------------------- - Thu Dec 27 04:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone '2001.12.27 04:05:06.789-08'; - timestamptz ----------------------------------- - Thu Dec 27 04:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone '2001/12/27 04:05:06.789-08'; - timestamptz ----------------------------------- - Thu Dec 27 04:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone '12/27/2001 04:05:06.789-08'; - timestamptz ----------------------------------- - Thu Dec 27 04:05:06.789 2001 PST -(1 row) - --- should fail in mdy mode: -SELECT timestamp with time zone '27/12/2001 04:05:06.789-08'; -ERROR: date/time field value out of range: "27/12/2001 04:05:06.789-08" -HINT: Perhaps you need a different "datestyle" setting. -set datestyle to dmy; -SELECT timestamp with time zone '27/12/2001 04:05:06.789-08'; - timestamptz ----------------------------------- - Thu 27 Dec 04:05:06.789 2001 PST -(1 row) - -reset datestyle; -SELECT timestamp with time zone 'Y2001M12D27H04M05S06.789+08'; - timestamptz ----------------------------------- - Wed Dec 26 12:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone 'Y2001M12D27H04M05S06.789-08'; - timestamptz ----------------------------------- - Thu Dec 27 04:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone 'Y2001M12D27H04MM05S06.789+08'; - timestamptz ----------------------------------- - Wed Dec 26 12:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone 'Y2001M12D27H04MM05S06.789-08'; - timestamptz ----------------------------------- - Thu Dec 27 04:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone 'J2452271+08'; - timestamptz ------------------------------- - Wed Dec 26 08:00:00 2001 PST -(1 row) - -SELECT timestamp with time zone 'J2452271-08'; - timestamptz ------------------------------- - Thu Dec 27 00:00:00 2001 PST -(1 row) - -SELECT timestamp with time zone 'J2452271.5+08'; - timestamptz ------------------------------- - Wed Dec 26 20:00:00 2001 PST -(1 row) - -SELECT timestamp with time zone 'J2452271.5-08'; - timestamptz ------------------------------- - Thu Dec 27 12:00:00 2001 PST -(1 row) - -SELECT timestamp with time zone 'J2452271 04:05:06+08'; - timestamptz ------------------------------- - Wed Dec 26 12:05:06 2001 PST -(1 row) - -SELECT timestamp with time zone 'J2452271 04:05:06-08'; - timestamptz ------------------------------- - Thu Dec 27 04:05:06 2001 PST -(1 row) - -SELECT timestamp with time zone 'J2452271T040506+08'; - timestamptz ------------------------------- - Wed Dec 26 12:05:06 2001 PST -(1 row) - -SELECT timestamp with time zone 'J2452271T040506-08'; - timestamptz ------------------------------- - Thu Dec 27 04:05:06 2001 PST -(1 row) - -SELECT timestamp with time zone 'J2452271T040506.789+08'; - timestamptz ----------------------------------- - Wed Dec 26 12:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone 'J2452271T040506.789-08'; - timestamptz ----------------------------------- - Thu Dec 27 04:05:06.789 2001 PST -(1 row) - --- German/European-style dates with periods as delimiters -SELECT timestamp with time zone '12.27.2001 04:05:06.789+08'; - timestamptz ----------------------------------- - Wed Dec 26 12:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone '12.27.2001 04:05:06.789-08'; - timestamptz ----------------------------------- - Thu Dec 27 04:05:06.789 2001 PST -(1 row) - -SET DateStyle = 'German'; -SELECT timestamp with time zone '27.12.2001 04:05:06.789+08'; - timestamptz ------------------------------ - 26.12.2001 12:05:06.789 PST -(1 row) - -SELECT timestamp with time zone '27.12.2001 04:05:06.789-08'; - timestamptz ------------------------------ - 27.12.2001 04:05:06.789 PST -(1 row) - -SET DateStyle = 'ISO'; --- As of 7.4, allow time without time zone having a time zone specified -SELECT time without time zone '040506.789+08'; - time ---------------- - 04:05:06.7890 -(1 row) - -SELECT time without time zone '040506.789-08'; - time ---------------- - 04:05:06.7890 -(1 row) - -SELECT time without time zone 'T040506.789+08'; - time ---------------- - 04:05:06.7890 -(1 row) - -SELECT time without time zone 'T040506.789-08'; - time ---------------- - 04:05:06.7890 -(1 row) - -SELECT time with time zone '040506.789+08'; - timetz ------------------- - 04:05:06.7890+08 -(1 row) - -SELECT time with time zone '040506.789-08'; - timetz ------------------- - 04:05:06.7890-08 -(1 row) - -SELECT time with time zone 'T040506.789+08'; - timetz ------------------- - 04:05:06.7890+08 -(1 row) - -SELECT time with time zone 'T040506.789-08'; - timetz ------------------- - 04:05:06.7890-08 -(1 row) - -SELECT time with time zone 'T040506.789 +08'; - timetz ------------------- - 04:05:06.7890+08 -(1 row) - -SELECT time with time zone 'T040506.789 -08'; - timetz ------------------- - 04:05:06.7890-08 -(1 row) - -SET DateStyle = 'Postgres, MDY'; --- --- date, time arithmetic --- -SELECT date '1981-02-03' + time '04:05:06' AS "Date + Time"; - Date + Time --------------------------- - Tue Feb 03 04:05:06 1981 -(1 row) - -SELECT date '1991-02-03' + time with time zone '04:05:06 PST' AS "Date + Time PST"; - Date + Time PST ------------------------------- - Sun Feb 03 04:05:06 1991 PST -(1 row) - -SELECT date '2001-02-03' + time with time zone '04:05:06 UTC' AS "Date + Time UTC"; - Date + Time UTC ------------------------------- - Fri Feb 02 20:05:06 2001 PST -(1 row) - -SELECT date '1991-02-03' + interval '2 years' AS "Add Two Years"; - Add Two Years --------------------------- - Wed Feb 03 00:00:00 1993 -(1 row) - -SELECT date '2001-12-13' - interval '2 years' AS "Subtract Two Years"; - Subtract Two Years --------------------------- - Mon Dec 13 00:00:00 1999 -(1 row) - --- subtract time from date should not make sense; use interval instead -SELECT date '1991-02-03' - time '04:05:06' AS "Subtract Time"; - Subtract Time --------------------------- - Sat Feb 02 19:54:54 1991 -(1 row) - -SELECT date '1991-02-03' - time with time zone '04:05:06 UTC' AS "Subtract Time UTC"; -ERROR: operator does not exist: date - time with time zone -HINT: No operator matches the given name and argument type(s). You may need to add explicit type casts. --- --- timestamp, interval arithmetic --- -SELECT timestamp without time zone '1996-03-01' - interval '1 second' AS "Feb 29"; - Feb 29 --------------------------- - Thu Feb 29 23:59:59 1996 -(1 row) - -SELECT timestamp without time zone '1999-03-01' - interval '1 second' AS "Feb 28"; - Feb 28 --------------------------- - Sun Feb 28 23:59:59 1999 -(1 row) - -SELECT timestamp without time zone '2000-03-01' - interval '1 second' AS "Feb 29"; - Feb 29 --------------------------- - Tue Feb 29 23:59:59 2000 -(1 row) - -SELECT timestamp without time zone '1999-12-01' + interval '1 month - 1 second' AS "Dec 31"; - Dec 31 --------------------------- - Fri Dec 31 23:59:59 1999 -(1 row) - -SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '106000000 days' AS "Feb 23, 285506"; - Feb 23, 285506 ----------------------------- - Fri Feb 23 00:00:00 285506 -(1 row) - -SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '107000000 days' AS "Jan 20, 288244"; - Jan 20, 288244 ----------------------------- - Sat Jan 20 00:00:00 288244 -(1 row) - -SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '109203489 days' AS "Dec 31, 294276"; - Dec 31, 294276 ----------------------------- - Sun Dec 31 00:00:00 294276 -(1 row) - -SELECT timestamp without time zone '12/31/294276' - timestamp without time zone '12/23/1999' AS "106751991 Days"; - 106751991 Days ------------------- - @ 106751991 days -(1 row) - --- Shorthand values --- Not directly usable for regression testing since these are not constants. --- So, just try to test parser and hope for the best - thomas 97/04/26 -SELECT (timestamp without time zone 'today' = (timestamp without time zone 'yesterday' + interval '1 day')) as "True"; - True ------- - t -(1 row) - -SELECT (timestamp without time zone 'today' = (timestamp without time zone 'tomorrow' - interval '1 day')) as "True"; - True ------- - t -(1 row) - -SELECT (timestamp without time zone 'tomorrow' = (timestamp without time zone 'yesterday' + interval '2 days')) as "True"; - True ------- - t -(1 row) - -SELECT (timestamp without time zone 'tomorrow' > 'now') as "True"; - True ------- - t -(1 row) - --- Convert from date and time to timestamp --- This test used to be timestamp(date,time) but no longer allowed by grammar --- to enable support for SQL99 timestamp type syntax. -SELECT date '1994-01-01' + time '11:00' AS "Jan_01_1994_11am"; - Jan_01_1994_11am --------------------------- - Sat Jan 01 11:00:00 1994 -(1 row) - -SELECT date '1994-01-01' + time '10:00' AS "Jan_01_1994_10am"; - Jan_01_1994_10am --------------------------- - Sat Jan 01 10:00:00 1994 -(1 row) - -SELECT date '1994-01-01' + timetz '11:00-5' AS "Jan_01_1994_8am"; - Jan_01_1994_8am ------------------------------- - Sat Jan 01 08:00:00 1994 PST -(1 row) - -SELECT timestamptz(date '1994-01-01', time with time zone '11:00-5') AS "Jan_01_1994_8am"; - Jan_01_1994_8am ------------------------------- - Sat Jan 01 08:00:00 1994 PST -(1 row) - -SELECT '' AS "64", d1 + interval '1 year' AS one_year FROM TIMESTAMP_TBL; - 64 | one_year -----+----------------------------- - | -infinity - | infinity - | Fri Jan 01 00:00:00 1971 - | 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 - | Fri Jan 02 00:00:00 1998 - | Fri Jan 02 03:04:05 1998 - | Tue Feb 10 17:32:01 1998 - | Tue Feb 10 17:32:01 1998 - | Tue Feb 10 17:32:01 1998 - | Tue Feb 10 17:32:01 1998 - | Wed Jun 10 17:32:01 1998 - | Sun Sep 22 18:19:20 2002 - | Thu Mar 15 08:14:01 2001 - | Thu Mar 15 13:14:02 2001 - | Thu Mar 15 12:14:03 2001 - | Thu Mar 15 03:14:04 2001 - | Thu Mar 15 02:14:05 2001 - | Tue Feb 10 17:32:01 1998 - | Tue Feb 10 17:32:01 1998 - | Tue Feb 10 17:32:00 1998 - | Tue Feb 10 17:32:01 1998 - | Tue Feb 10 17:32:01 1998 - | Tue Feb 10 17:32:01 1998 - | Tue Feb 10 17:32:01 1998 - | Tue Feb 10 17:32:01 1998 - | Tue Feb 10 17:32:01 1998 - | Tue Feb 10 17:32:01 1998 - | Tue Feb 10 17:32:01 1998 - | Wed Jun 10 18:32:01 1998 - | Tue Feb 10 17:32:01 1998 - | Wed Feb 11 17:32:01 1998 - | Thu Feb 12 17:32:01 1998 - | Fri Feb 13 17:32:01 1998 - | Sat Feb 14 17:32:01 1998 - | Sun Feb 15 17:32:01 1998 - | Mon Feb 16 17:32:01 1998 - | Thu Feb 16 17:32:01 0096 BC - | Sun Feb 16 17:32:01 0098 - | Fri Feb 16 17:32:01 0598 - | Wed Feb 16 17:32:01 1098 - | Sun Feb 16 17:32:01 1698 - | Fri Feb 16 17:32:01 1798 - | Wed Feb 16 17:32:01 1898 - | Mon Feb 16 17:32:01 1998 - | Sun Feb 16 17:32:01 2098 - | Fri Feb 28 17:32:01 1997 - | Fri Feb 28 17:32:01 1997 - | Sat Mar 01 17:32:01 1997 - | Tue Dec 30 17:32:01 1997 - | Wed Dec 31 17:32:01 1997 - | Thu Jan 01 17:32:01 1998 - | Sat Feb 28 17:32:01 1998 - | Sun Mar 01 17:32:01 1998 - | Wed Dec 30 17:32:01 1998 - | Thu Dec 31 17:32:01 1998 - | Sun Dec 31 17:32:01 2000 - | Mon Jan 01 17:32:01 2001 - | Mon Dec 31 17:32:01 2001 - | Tue Jan 01 17:32:01 2002 -(64 rows) - -SELECT '' AS "64", d1 - interval '1 year' AS one_year FROM TIMESTAMP_TBL; - 64 | one_year -----+----------------------------- - | -infinity - | infinity - | Wed Jan 01 00:00:00 1969 - | 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 - | Tue Jan 02 00:00:00 1996 - | Tue Jan 02 03:04:05 1996 - | Sat Feb 10 17:32:01 1996 - | Sat Feb 10 17:32:01 1996 - | Sat Feb 10 17:32:01 1996 - | Sat Feb 10 17:32:01 1996 - | Mon Jun 10 17:32:01 1996 - | Fri Sep 22 18:19:20 2000 - | Mon Mar 15 08:14:01 1999 - | Mon Mar 15 13:14:02 1999 - | Mon Mar 15 12:14:03 1999 - | Mon Mar 15 03:14:04 1999 - | Mon Mar 15 02:14:05 1999 - | Sat Feb 10 17:32:01 1996 - | Sat Feb 10 17:32:01 1996 - | Sat Feb 10 17:32:00 1996 - | Sat Feb 10 17:32:01 1996 - | Sat Feb 10 17:32:01 1996 - | Sat Feb 10 17:32:01 1996 - | Sat Feb 10 17:32:01 1996 - | Sat Feb 10 17:32:01 1996 - | Sat Feb 10 17:32:01 1996 - | Sat Feb 10 17:32:01 1996 - | Sat Feb 10 17:32:01 1996 - | Mon Jun 10 18:32:01 1996 - | Sat Feb 10 17:32:01 1996 - | Sun Feb 11 17:32:01 1996 - | Mon Feb 12 17:32:01 1996 - | Tue Feb 13 17:32:01 1996 - | Wed Feb 14 17:32:01 1996 - | Thu Feb 15 17:32:01 1996 - | Fri Feb 16 17:32:01 1996 - | Mon Feb 16 17:32:01 0098 BC - | Thu Feb 16 17:32:01 0096 - | Tue Feb 16 17:32:01 0596 - | Sun Feb 16 17:32:01 1096 - | Thu Feb 16 17:32:01 1696 - | Tue Feb 16 17:32:01 1796 - | Sun Feb 16 17:32:01 1896 - | Fri Feb 16 17:32:01 1996 - | Thu Feb 16 17:32:01 2096 - | Tue Feb 28 17:32:01 1995 - | Tue Feb 28 17:32:01 1995 - | Wed Mar 01 17:32:01 1995 - | Sat Dec 30 17:32:01 1995 - | Sun Dec 31 17:32:01 1995 - | Mon Jan 01 17:32:01 1996 - | Wed Feb 28 17:32:01 1996 - | Fri Mar 01 17:32:01 1996 - | Mon Dec 30 17:32:01 1996 - | Tue Dec 31 17:32:01 1996 - | Thu Dec 31 17:32:01 1998 - | Fri Jan 01 17:32:01 1999 - | Fri Dec 31 17:32:01 1999 - | Sat Jan 01 17:32:01 2000 -(64 rows) - -SELECT timestamp with time zone '1996-03-01' - interval '1 second' AS "Feb 29"; - Feb 29 ------------------------------- - Thu Feb 29 23:59:59 1996 PST -(1 row) - -SELECT timestamp with time zone '1999-03-01' - interval '1 second' AS "Feb 28"; - Feb 28 ------------------------------- - Sun Feb 28 23:59:59 1999 PST -(1 row) - -SELECT timestamp with time zone '2000-03-01' - interval '1 second' AS "Feb 29"; - Feb 29 ------------------------------- - Tue Feb 29 23:59:59 2000 PST -(1 row) - -SELECT timestamp with time zone '1999-12-01' + interval '1 month - 1 second' AS "Dec 31"; - Dec 31 ------------------------------- - Fri Dec 31 23:59:59 1999 PST -(1 row) - -SELECT (timestamp with time zone 'today' = (timestamp with time zone 'yesterday' + interval '1 day')) as "True"; - True ------- - t -(1 row) - -SELECT (timestamp with time zone 'today' = (timestamp with time zone 'tomorrow' - interval '1 day')) as "True"; - True ------- - t -(1 row) - -SELECT (timestamp with time zone 'tomorrow' = (timestamp with time zone 'yesterday' + interval '2 days')) as "True"; - True ------- - t -(1 row) - -SELECT (timestamp with time zone 'tomorrow' > 'now') as "True"; - True ------- - t -(1 row) - -SELECT timestamptz(date '1994-01-01', time '11:00') AS "Jan_01_1994_10am"; - Jan_01_1994_10am ------------------------------- - Sat Jan 01 11:00:00 1994 PST -(1 row) - -SELECT timestamptz(date '1994-01-01', time '10:00') AS "Jan_01_1994_9am"; - Jan_01_1994_9am ------------------------------- - Sat Jan 01 10:00:00 1994 PST -(1 row) - -SELECT timestamptz(date '1994-01-01', time with time zone '11:00-8') AS "Jan_01_1994_11am"; - Jan_01_1994_11am ------------------------------- - Sat Jan 01 11:00:00 1994 PST -(1 row) - -SELECT timestamptz(date '1994-01-01', time with time zone '10:00-8') AS "Jan_01_1994_10am"; - Jan_01_1994_10am ------------------------------- - Sat Jan 01 10:00:00 1994 PST -(1 row) - -SELECT timestamptz(date '1994-01-01', time with time zone '11:00-5') AS "Jan_01_1994_8am"; - Jan_01_1994_8am ------------------------------- - Sat Jan 01 08:00:00 1994 PST -(1 row) - -SELECT '' AS "64", d1 + interval '1 year' AS one_year FROM TIMESTAMPTZ_TBL; - 64 | one_year -----+--------------------------------- - | -infinity - | infinity - | Thu Dec 31 16:00:00 1970 PST - | Tue Feb 10 17:32:01 1998 PST - | Tue Feb 10 17:32:01 1998 PST - | Tue Feb 10 17:32:02 1998 PST - | Tue Feb 10 17:32:01.40 1998 PST - | Tue Feb 10 17:32:01.50 1998 PST - | Tue Feb 10 17:32:01.60 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 - | Tue Feb 10 17:32:01 1998 PST - | Tue Feb 10 17:32:01 1998 PST - | Tue Feb 10 17:32:01 1998 PST - | Wed Jun 10 17:32:01 1998 PDT - | Sun Sep 22 18:19:20 2002 PDT - | Thu Mar 15 08:14:01 2001 PST - | Thu Mar 15 04:14:02 2001 PST - | Thu Mar 15 02:14:03 2001 PST - | Thu Mar 15 03:14:04 2001 PST - | Thu Mar 15 01:14:05 2001 PST - | Tue Feb 10 17:32:01 1998 PST - | Tue Feb 10 17:32:01 1998 PST - | Tue Feb 10 17:32:00 1998 PST - | Tue Feb 10 17:32:01 1998 PST - | Tue Feb 10 17:32:01 1998 PST - | Tue Feb 10 17:32:01 1998 PST - | Tue Feb 10 17:32:01 1998 PST - | Tue Feb 10 17:32:01 1998 PST - | Tue Feb 10 09:32:01 1998 PST - | Tue Feb 10 09:32:01 1998 PST - | Tue Feb 10 09:32:01 1998 PST - | Wed Jun 10 18:32:01 1998 PDT - | Tue Feb 10 17:32:01 1998 PST - | Wed Feb 11 17:32:01 1998 PST - | Thu Feb 12 17:32:01 1998 PST - | Fri Feb 13 17:32:01 1998 PST - | Sat Feb 14 17:32:01 1998 PST - | Sun Feb 15 17:32:01 1998 PST - | Mon Feb 16 17:32:01 1998 PST - | Thu Feb 16 17:32:01 0096 BC - | Sun Feb 16 17:32:01 0098 - | Fri Feb 16 17:32:01 0598 - | Wed Feb 16 17:32:01 1098 - | Sun Feb 16 17:32:01 1698 - | Fri Feb 16 17:32:01 1798 - | Wed Feb 16 17:32:01 1898 - | Mon Feb 16 17:32:01 1998 PST - | Sun Feb 16 17:32:01 2098 - | Fri Feb 28 17:32:01 1997 PST - | Fri Feb 28 17:32:01 1997 PST - | Sat Mar 01 17:32:01 1997 PST - | Tue Dec 30 17:32:01 1997 PST - | Wed Dec 31 17:32:01 1997 PST - | Thu Jan 01 17:32:01 1998 PST - | Sat Feb 28 17:32:01 1998 PST - | Sun Mar 01 17:32:01 1998 PST - | Wed Dec 30 17:32:01 1998 PST - | Thu Dec 31 17:32:01 1998 PST - | Sun Dec 31 17:32:01 2000 PST - | Mon Jan 01 17:32:01 2001 PST - | Mon Dec 31 17:32:01 2001 PST - | Tue Jan 01 17:32:01 2002 PST -(64 rows) - -SELECT '' AS "64", d1 - interval '1 year' AS one_year FROM TIMESTAMPTZ_TBL; - 64 | one_year -----+--------------------------------- - | -infinity - | infinity - | Tue Dec 31 16:00:00 1968 PST - | Sat Feb 10 17:32:01 1996 PST - | Sat Feb 10 17:32:01 1996 PST - | Sat Feb 10 17:32:02 1996 PST - | Sat Feb 10 17:32:01.40 1996 PST - | Sat Feb 10 17:32:01.50 1996 PST - | Sat Feb 10 17:32:01.60 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 - | Sat Feb 10 17:32:01 1996 PST - | Sat Feb 10 17:32:01 1996 PST - | Sat Feb 10 17:32:01 1996 PST - | Mon Jun 10 17:32:01 1996 PDT - | Fri Sep 22 18:19:20 2000 PDT - | Mon Mar 15 08:14:01 1999 PST - | Mon Mar 15 04:14:02 1999 PST - | Mon Mar 15 02:14:03 1999 PST - | Mon Mar 15 03:14:04 1999 PST - | Mon Mar 15 01:14:05 1999 PST - | Sat Feb 10 17:32:01 1996 PST - | Sat Feb 10 17:32:01 1996 PST - | Sat Feb 10 17:32:00 1996 PST - | Sat Feb 10 17:32:01 1996 PST - | Sat Feb 10 17:32:01 1996 PST - | Sat Feb 10 17:32:01 1996 PST - | Sat Feb 10 17:32:01 1996 PST - | Sat Feb 10 17:32:01 1996 PST - | Sat Feb 10 09:32:01 1996 PST - | Sat Feb 10 09:32:01 1996 PST - | Sat Feb 10 09:32:01 1996 PST - | Mon Jun 10 18:32:01 1996 PDT - | Sat Feb 10 17:32:01 1996 PST - | Sun Feb 11 17:32:01 1996 PST - | Mon Feb 12 17:32:01 1996 PST - | Tue Feb 13 17:32:01 1996 PST - | Wed Feb 14 17:32:01 1996 PST - | Thu Feb 15 17:32:01 1996 PST - | Fri Feb 16 17:32:01 1996 PST - | Mon Feb 16 17:32:01 0098 BC - | Thu Feb 16 17:32:01 0096 - | Tue Feb 16 17:32:01 0596 - | Sun Feb 16 17:32:01 1096 - | Thu Feb 16 17:32:01 1696 - | Tue Feb 16 17:32:01 1796 - | Sun Feb 16 17:32:01 1896 - | Fri Feb 16 17:32:01 1996 PST - | Thu Feb 16 17:32:01 2096 - | Tue Feb 28 17:32:01 1995 PST - | Tue Feb 28 17:32:01 1995 PST - | Wed Mar 01 17:32:01 1995 PST - | Sat Dec 30 17:32:01 1995 PST - | Sun Dec 31 17:32:01 1995 PST - | Mon Jan 01 17:32:01 1996 PST - | Wed Feb 28 17:32:01 1996 PST - | Fri Mar 01 17:32:01 1996 PST - | Mon Dec 30 17:32:01 1996 PST - | Tue Dec 31 17:32:01 1996 PST - | Thu Dec 31 17:32:01 1998 PST - | Fri Jan 01 17:32:01 1999 PST - | Fri Dec 31 17:32:01 1999 PST - | Sat Jan 01 17:32:01 2000 PST -(64 rows) - --- --- time, interval arithmetic --- -SELECT CAST(time '01:02' AS interval) AS "+01:02"; - +01:02 ------------------ - @ 1 hour 2 mins -(1 row) - -SELECT CAST(interval '02:03' AS time) AS "02:03:00"; - 02:03:00 ----------- - 02:03:00 -(1 row) - -SELECT time '01:30' + interval '02:01' AS "03:31:00"; - 03:31:00 ----------- - 03:31:00 -(1 row) - -SELECT time '01:30' - interval '02:01' AS "23:29:00"; - 23:29:00 ----------- - 23:29:00 -(1 row) - -SELECT time '02:30' + interval '36:01' AS "14:31:00"; - 14:31:00 ----------- - 14:31:00 -(1 row) - -SELECT time '03:30' + interval '1 month 04:01' AS "07:31:00"; - 07:31:00 ----------- - 07:31:00 -(1 row) - -SELECT interval '04:30' - time '01:02' AS "20:32:00"; - 20:32:00 ----------- - 20:32:00 -(1 row) - -SELECT CAST(time with time zone '01:02-08' AS interval) AS "+00:01"; -ERROR: cannot cast type time with time zone to interval -SELECT CAST(interval '02:03' AS time with time zone) AS "02:03:00-08"; -ERROR: cannot cast type interval to time with time zone -SELECT time with time zone '01:30-08' - interval '02:01' AS "23:29:00-08"; - 23:29:00-08 -------------- - 23:29:00-08 -(1 row) - -SELECT time with time zone '02:30-08' + interval '36:01' AS "14:31:00-08"; - 14:31:00-08 -------------- - 14:31:00-08 -(1 row) - --- These two tests cannot be used because they default to current timezone, --- which may be either -08 or -07 depending on the time of year. --- SELECT time with time zone '01:30' + interval '02:01' AS "03:31:00-08"; --- SELECT time with time zone '03:30' + interval '1 month 04:01' AS "07:31:00-08"; --- Try the following two tests instead, as a poor substitute -SELECT CAST(CAST(date 'today' + time with time zone '01:30' - + interval '02:01' AS time with time zone) AS time) AS "03:31:00"; - 03:31:00 ----------- - 03:31:00 -(1 row) - -SELECT CAST(cast(date 'today' + time with time zone '03:30' - + interval '1 month 04:01' as timestamp without time zone) AS time) AS "07:31:00"; - 07:31:00 ----------- - 07:31:00 -(1 row) - -SELECT interval '04:30' - time with time zone '01:02-05' AS "20:32:00-05"; - 20:32:00-05 -------------- - 20:32:00-05 -(1 row) - -SELECT t.d1 + i.f1 AS "102" FROM TIMESTAMP_TBL t, INTERVAL_TBL i - WHERE t.d1 BETWEEN '1990-01-01' AND '2001-01-01' - AND i.f1 BETWEEN '00:00' AND '23:00'; - 102 ------------------------------ - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:02 1997 - Mon Feb 10 22:32:02 1997 - Mon Feb 10 17:33:01.40 1997 - Mon Feb 10 22:32:01.40 1997 - Mon Feb 10 17:33:01.50 1997 - Mon Feb 10 22:32:01.50 1997 - Mon Feb 10 17:33:01.60 1997 - Mon Feb 10 22:32:01.60 1997 - Thu Jan 02 00:01:00 1997 - Thu Jan 02 05:00:00 1997 - Thu Jan 02 03:05:05 1997 - Thu Jan 02 08:04:05 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Tue Jun 10 17:33:01 1997 - Tue Jun 10 22:32:01 1997 - Wed Mar 15 08:15:01 2000 - Wed Mar 15 13:14:01 2000 - Wed Mar 15 13:15:02 2000 - Wed Mar 15 18:14:02 2000 - Wed Mar 15 12:15:03 2000 - Wed Mar 15 17:14:03 2000 - Wed Mar 15 03:15:04 2000 - Wed Mar 15 08:14:04 2000 - Wed Mar 15 02:15:05 2000 - Wed Mar 15 07:14:05 2000 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:00 1997 - Mon Feb 10 22:32:00 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Tue Jun 10 18:33:01 1997 - Tue Jun 10 23:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Tue Feb 11 17:33:01 1997 - Tue Feb 11 22:32:01 1997 - Wed Feb 12 17:33:01 1997 - Wed Feb 12 22:32:01 1997 - Thu Feb 13 17:33:01 1997 - Thu Feb 13 22:32:01 1997 - Fri Feb 14 17:33:01 1997 - Fri Feb 14 22:32:01 1997 - Sat Feb 15 17:33:01 1997 - Sat Feb 15 22:32:01 1997 - Sun Feb 16 17:33:01 1997 - Sun Feb 16 22:32:01 1997 - Sun Feb 16 17:33:01 1997 - Sun Feb 16 22:32:01 1997 - Wed Feb 28 17:33:01 1996 - Wed Feb 28 22:32:01 1996 - Thu Feb 29 17:33:01 1996 - Thu Feb 29 22:32:01 1996 - Fri Mar 01 17:33:01 1996 - Fri Mar 01 22:32:01 1996 - Mon Dec 30 17:33:01 1996 - Mon Dec 30 22:32:01 1996 - Tue Dec 31 17:33:01 1996 - Tue Dec 31 22:32:01 1996 - Wed Jan 01 17:33:01 1997 - Wed Jan 01 22:32:01 1997 - Fri Feb 28 17:33:01 1997 - Fri Feb 28 22:32:01 1997 - Sat Mar 01 17:33:01 1997 - Sat Mar 01 22:32:01 1997 - Tue Dec 30 17:33:01 1997 - Tue Dec 30 22:32:01 1997 - Wed Dec 31 17:33:01 1997 - Wed Dec 31 22:32:01 1997 - Fri Dec 31 17:33:01 1999 - Fri Dec 31 22:32:01 1999 - Sat Jan 01 17:33:01 2000 - Sat Jan 01 22:32:01 2000 - Sun Dec 31 17:33:01 2000 - Sun Dec 31 22:32:01 2000 -(102 rows) - -SELECT t.d1 - i.f1 AS "102" FROM TIMESTAMP_TBL t, INTERVAL_TBL i - WHERE t.d1 BETWEEN '1990-01-01' AND '2001-01-01' - AND i.f1 BETWEEN '00:00' AND '23:00'; - 102 ------------------------------ - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:02 1997 - Mon Feb 10 12:32:02 1997 - Mon Feb 10 17:31:01.40 1997 - Mon Feb 10 12:32:01.40 1997 - Mon Feb 10 17:31:01.50 1997 - Mon Feb 10 12:32:01.50 1997 - Mon Feb 10 17:31:01.60 1997 - Mon Feb 10 12:32:01.60 1997 - Wed Jan 01 23:59:00 1997 - Wed Jan 01 19:00:00 1997 - Thu Jan 02 03:03:05 1997 - Wed Jan 01 22:04:05 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Tue Jun 10 17:31:01 1997 - Tue Jun 10 12:32:01 1997 - Wed Mar 15 08:13:01 2000 - Wed Mar 15 03:14:01 2000 - Wed Mar 15 13:13:02 2000 - Wed Mar 15 08:14:02 2000 - Wed Mar 15 12:13:03 2000 - Wed Mar 15 07:14:03 2000 - Wed Mar 15 03:13:04 2000 - Tue Mar 14 22:14:04 2000 - Wed Mar 15 02:13:05 2000 - Tue Mar 14 21:14:05 2000 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:00 1997 - Mon Feb 10 12:32:00 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Tue Jun 10 18:31:01 1997 - Tue Jun 10 13:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Tue Feb 11 17:31:01 1997 - Tue Feb 11 12:32:01 1997 - Wed Feb 12 17:31:01 1997 - Wed Feb 12 12:32:01 1997 - Thu Feb 13 17:31:01 1997 - Thu Feb 13 12:32:01 1997 - Fri Feb 14 17:31:01 1997 - Fri Feb 14 12:32:01 1997 - Sat Feb 15 17:31:01 1997 - Sat Feb 15 12:32:01 1997 - Sun Feb 16 17:31:01 1997 - Sun Feb 16 12:32:01 1997 - Sun Feb 16 17:31:01 1997 - Sun Feb 16 12:32:01 1997 - Wed Feb 28 17:31:01 1996 - Wed Feb 28 12:32:01 1996 - Thu Feb 29 17:31:01 1996 - Thu Feb 29 12:32:01 1996 - Fri Mar 01 17:31:01 1996 - Fri Mar 01 12:32:01 1996 - Mon Dec 30 17:31:01 1996 - Mon Dec 30 12:32:01 1996 - Tue Dec 31 17:31:01 1996 - Tue Dec 31 12:32:01 1996 - Wed Jan 01 17:31:01 1997 - Wed Jan 01 12:32:01 1997 - Fri Feb 28 17:31:01 1997 - Fri Feb 28 12:32:01 1997 - Sat Mar 01 17:31:01 1997 - Sat Mar 01 12:32:01 1997 - Tue Dec 30 17:31:01 1997 - Tue Dec 30 12:32:01 1997 - Wed Dec 31 17:31:01 1997 - Wed Dec 31 12:32:01 1997 - Fri Dec 31 17:31:01 1999 - Fri Dec 31 12:32:01 1999 - Sat Jan 01 17:31:01 2000 - Sat Jan 01 12:32:01 2000 - Sun Dec 31 17:31:01 2000 - Sun Dec 31 12:32:01 2000 -(102 rows) - -SELECT t.f1 + i.f1 AS "80" FROM TIME_TBL t, INTERVAL_TBL i; - 80 -------------- - 00:01:00 - 05:00:00 - 00:00:00 - 00:00:00 - 00:00:00 - 23:59:46 - 02:03:04 - 00:00:00 - 00:00:00 - 12:00:00 - 01:01:00 - 06:00:00 - 01:00:00 - 01:00:00 - 01:00:00 - 00:59:46 - 03:03:04 - 01:00:00 - 01:00:00 - 13:00:00 - 02:04:00 - 07:03:00 - 02:03:00 - 02:03:00 - 02:03:00 - 02:02:46 - 04:06:04 - 02:03:00 - 02:03:00 - 14:03:00 - 12:00:00 - 16:59:00 - 11:59:00 - 11:59:00 - 11:59:00 - 11:58:46 - 14:02:04 - 11:59:00 - 11:59:00 - 23:59:00 - 12:01:00 - 17:00:00 - 12:00:00 - 12:00:00 - 12:00:00 - 11:59:46 - 14:03:04 - 12:00:00 - 12:00:00 - 00:00:00 - 12:02:00 - 17:01:00 - 12:01:00 - 12:01:00 - 12:01:00 - 12:00:46 - 14:04:04 - 12:01:00 - 12:01:00 - 00:01:00 - 00:00:00 - 04:59:00 - 23:59:00 - 23:59:00 - 23:59:00 - 23:58:46 - 02:02:04 - 23:59:00 - 23:59:00 - 11:59:00 - 00:00:59.99 - 04:59:59.99 - 23:59:59.99 - 23:59:59.99 - 23:59:59.99 - 23:59:45.99 - 02:03:03.99 - 23:59:59.99 - 23:59:59.99 - 11:59:59.99 -(80 rows) - -SELECT t.f1 - i.f1 AS "80" FROM TIME_TBL t, INTERVAL_TBL i; - 80 -------------- - 23:59:00 - 19:00:00 - 00:00:00 - 00:00:00 - 00:00:00 - 00:00:14 - 21:56:56 - 00:00:00 - 00:00:00 - 12:00:00 - 00:59:00 - 20:00:00 - 01:00:00 - 01:00:00 - 01:00:00 - 01:00:14 - 22:56:56 - 01:00:00 - 01:00:00 - 13:00:00 - 02:02:00 - 21:03:00 - 02:03:00 - 02:03:00 - 02:03:00 - 02:03:14 - 23:59:56 - 02:03:00 - 02:03:00 - 14:03:00 - 11:58:00 - 06:59:00 - 11:59:00 - 11:59:00 - 11:59:00 - 11:59:14 - 09:55:56 - 11:59:00 - 11:59:00 - 23:59:00 - 11:59:00 - 07:00:00 - 12:00:00 - 12:00:00 - 12:00:00 - 12:00:14 - 09:56:56 - 12:00:00 - 12:00:00 - 00:00:00 - 12:00:00 - 07:01:00 - 12:01:00 - 12:01:00 - 12:01:00 - 12:01:14 - 09:57:56 - 12:01:00 - 12:01:00 - 00:01:00 - 23:58:00 - 18:59:00 - 23:59:00 - 23:59:00 - 23:59:00 - 23:59:14 - 21:55:56 - 23:59:00 - 23:59:00 - 11:59:00 - 23:58:59.99 - 18:59:59.99 - 23:59:59.99 - 23:59:59.99 - 23:59:59.99 - 00:00:13.99 - 21:56:55.99 - 23:59:59.99 - 23:59:59.99 - 11:59:59.99 -(80 rows) - -SELECT t.f1 + i.f1 AS "100" FROM TIMETZ_TBL t, INTERVAL_TBL i; - 100 ----------------- - 00:02:00-07 - 05:01:00-07 - 00:01:00-07 - 00:01:00-07 - 00:01:00-07 - 00:00:46-07 - 02:04:04-07 - 00:01:00-07 - 00:01:00-07 - 12:01:00-07 - 01:01:00-07 - 06:00:00-07 - 01:00:00-07 - 01:00:00-07 - 01:00:00-07 - 00:59:46-07 - 03:03:04-07 - 01:00:00-07 - 01:00:00-07 - 13:00:00-07 - 02:04:00-07 - 07:03:00-07 - 02:03:00-07 - 02:03:00-07 - 02:03:00-07 - 02:02:46-07 - 04:06:04-07 - 02:03:00-07 - 02:03:00-07 - 14:03:00-07 - 07:08:00-08 - 12:07:00-08 - 07:07:00-08 - 07:07:00-08 - 07:07:00-08 - 07:06:46-08 - 09:10:04-08 - 07:07:00-08 - 07:07:00-08 - 19:07:00-08 - 08:09:00-04 - 13:08:00-04 - 08:08:00-04 - 08:08:00-04 - 08:08:00-04 - 08:07:46-04 - 10:11:04-04 - 08:08:00-04 - 08:08:00-04 - 20:08:00-04 - 12:00:00-07 - 16:59:00-07 - 11:59:00-07 - 11:59:00-07 - 11:59:00-07 - 11:58:46-07 - 14:02:04-07 - 11:59:00-07 - 11:59:00-07 - 23:59:00-07 - 12:01:00-07 - 17:00:00-07 - 12:00:00-07 - 12:00:00-07 - 12:00:00-07 - 11:59:46-07 - 14:03:04-07 - 12:00:00-07 - 12:00:00-07 - 00:00:00-07 - 12:02:00-07 - 17:01:00-07 - 12:01:00-07 - 12:01:00-07 - 12:01:00-07 - 12:00:46-07 - 14:04:04-07 - 12:01:00-07 - 12:01:00-07 - 00:01:00-07 - 00:00:00-07 - 04:59:00-07 - 23:59:00-07 - 23:59:00-07 - 23:59:00-07 - 23:58:46-07 - 02:02:04-07 - 23:59:00-07 - 23:59:00-07 - 11:59:00-07 - 00:00:59.99-07 - 04:59:59.99-07 - 23:59:59.99-07 - 23:59:59.99-07 - 23:59:59.99-07 - 23:59:45.99-07 - 02:03:03.99-07 - 23:59:59.99-07 - 23:59:59.99-07 - 11:59:59.99-07 -(100 rows) - -SELECT t.f1 - i.f1 AS "100" FROM TIMETZ_TBL t, INTERVAL_TBL i; - 100 ----------------- - 00:00:00-07 - 19:01:00-07 - 00:01:00-07 - 00:01:00-07 - 00:01:00-07 - 00:01:14-07 - 21:57:56-07 - 00:01:00-07 - 00:01:00-07 - 12:01:00-07 - 00:59:00-07 - 20:00:00-07 - 01:00:00-07 - 01:00:00-07 - 01:00:00-07 - 01:00:14-07 - 22:56:56-07 - 01:00:00-07 - 01:00:00-07 - 13:00:00-07 - 02:02:00-07 - 21:03:00-07 - 02:03:00-07 - 02:03:00-07 - 02:03:00-07 - 02:03:14-07 - 23:59:56-07 - 02:03:00-07 - 02:03:00-07 - 14:03:00-07 - 07:06:00-08 - 02:07:00-08 - 07:07:00-08 - 07:07:00-08 - 07:07:00-08 - 07:07:14-08 - 05:03:56-08 - 07:07:00-08 - 07:07:00-08 - 19:07:00-08 - 08:07:00-04 - 03:08:00-04 - 08:08:00-04 - 08:08:00-04 - 08:08:00-04 - 08:08:14-04 - 06:04:56-04 - 08:08:00-04 - 08:08:00-04 - 20:08:00-04 - 11:58:00-07 - 06:59:00-07 - 11:59:00-07 - 11:59:00-07 - 11:59:00-07 - 11:59:14-07 - 09:55:56-07 - 11:59:00-07 - 11:59:00-07 - 23:59:00-07 - 11:59:00-07 - 07:00:00-07 - 12:00:00-07 - 12:00:00-07 - 12:00:00-07 - 12:00:14-07 - 09:56:56-07 - 12:00:00-07 - 12:00:00-07 - 00:00:00-07 - 12:00:00-07 - 07:01:00-07 - 12:01:00-07 - 12:01:00-07 - 12:01:00-07 - 12:01:14-07 - 09:57:56-07 - 12:01:00-07 - 12:01:00-07 - 00:01:00-07 - 23:58:00-07 - 18:59:00-07 - 23:59:00-07 - 23:59:00-07 - 23:59:00-07 - 23:59:14-07 - 21:55:56-07 - 23:59:00-07 - 23:59:00-07 - 11:59:00-07 - 23:58:59.99-07 - 18:59:59.99-07 - 23:59:59.99-07 - 23:59:59.99-07 - 23:59:59.99-07 - 00:00:13.99-07 - 21:56:55.99-07 - 23:59:59.99-07 - 23:59:59.99-07 - 11:59:59.99-07 -(100 rows) - --- SQL9x OVERLAPS operator --- test with time zone -SELECT (timestamp with time zone '2000-11-27', timestamp with time zone '2000-11-28') - OVERLAPS (timestamp with time zone '2000-11-27 12:00', timestamp with time zone '2000-11-30') AS "True"; - True ------- - t -(1 row) - -SELECT (timestamp with time zone '2000-11-26', timestamp with time zone '2000-11-27') - OVERLAPS (timestamp with time zone '2000-11-27 12:00', timestamp with time zone '2000-11-30') AS "False"; - False -------- - f -(1 row) - -SELECT (timestamp with time zone '2000-11-27', timestamp with time zone '2000-11-28') - OVERLAPS (timestamp with time zone '2000-11-27 12:00', interval '1 day') AS "True"; - True ------- - t -(1 row) - -SELECT (timestamp with time zone '2000-11-27', interval '12 hours') - OVERLAPS (timestamp with time zone '2000-11-27 12:00', timestamp with time zone '2000-11-30') AS "False"; - False -------- - f -(1 row) - -SELECT (timestamp with time zone '2000-11-27', interval '12 hours') - OVERLAPS (timestamp with time zone '2000-11-27', interval '12 hours') AS "True"; - True ------- - t -(1 row) - -SELECT (timestamp with time zone '2000-11-27', interval '12 hours') - OVERLAPS (timestamp with time zone '2000-11-27 12:00', interval '12 hours') AS "False"; - False -------- - f -(1 row) - --- test without time zone -SELECT (timestamp without time zone '2000-11-27', timestamp without time zone '2000-11-28') - OVERLAPS (timestamp without time zone '2000-11-27 12:00', timestamp without time zone '2000-11-30') AS "True"; - True ------- - t -(1 row) - -SELECT (timestamp without time zone '2000-11-26', timestamp without time zone '2000-11-27') - OVERLAPS (timestamp without time zone '2000-11-27 12:00', timestamp without time zone '2000-11-30') AS "False"; - False -------- - f -(1 row) - -SELECT (timestamp without time zone '2000-11-27', timestamp without time zone '2000-11-28') - OVERLAPS (timestamp without time zone '2000-11-27 12:00', interval '1 day') AS "True"; - True ------- - t -(1 row) - -SELECT (timestamp without time zone '2000-11-27', interval '12 hours') - OVERLAPS (timestamp without time zone '2000-11-27 12:00', timestamp without time zone '2000-11-30') AS "False"; - False -------- - f -(1 row) - -SELECT (timestamp without time zone '2000-11-27', interval '12 hours') - OVERLAPS (timestamp without time zone '2000-11-27', interval '12 hours') AS "True"; - True ------- - t -(1 row) - -SELECT (timestamp without time zone '2000-11-27', interval '12 hours') - OVERLAPS (timestamp without time zone '2000-11-27 12:00', interval '12 hours') AS "False"; - False -------- - f -(1 row) - --- test time and interval -SELECT (time '00:00', time '01:00') - OVERLAPS (time '00:30', time '01:30') AS "True"; - True ------- - t -(1 row) - -SELECT (time '00:00', interval '1 hour') - OVERLAPS (time '00:30', interval '1 hour') AS "True"; - True ------- - t -(1 row) - -SELECT (time '00:00', interval '1 hour') - OVERLAPS (time '01:30', interval '1 hour') AS "False"; - False -------- - f -(1 row) - --- SQL99 seems to want this to be false (and we conform to the spec). --- istm that this *should* return true, on the theory that time --- intervals can wrap around the day boundary - thomas 2001-09-25 -SELECT (time '00:00', interval '1 hour') - OVERLAPS (time '01:30', interval '1 day') AS "False"; - False -------- - f -(1 row) - -CREATE TABLE TEMP_TIMESTAMP (f1 timestamp with time zone); --- get some candidate input values -INSERT INTO TEMP_TIMESTAMP (f1) - SELECT d1 FROM TIMESTAMP_TBL - WHERE d1 BETWEEN '13-jun-1957' AND '1-jan-1997' - OR d1 BETWEEN '1-jan-1999' AND '1-jan-2010'; -SELECT '' AS "16", f1 AS "timestamp" - FROM TEMP_TIMESTAMP - ORDER BY "timestamp"; - 16 | timestamp -----+------------------------------ - | Thu Jan 01 00:00:00 1970 PST - | Wed Feb 28 17:32:01 1996 PST - | Thu Feb 29 17:32:01 1996 PST - | Fri Mar 01 17:32:01 1996 PST - | Mon Dec 30 17:32:01 1996 PST - | Tue Dec 31 17:32:01 1996 PST - | Fri Dec 31 17:32:01 1999 PST - | Sat Jan 01 17:32:01 2000 PST - | Wed Mar 15 02:14:05 2000 PST - | Wed Mar 15 03:14:04 2000 PST - | Wed Mar 15 08:14:01 2000 PST - | Wed Mar 15 12:14:03 2000 PST - | Wed Mar 15 13:14:02 2000 PST - | Sun Dec 31 17:32:01 2000 PST - | Mon Jan 01 17:32:01 2001 PST - | Sat Sep 22 18:19:20 2001 PDT -(16 rows) - -SELECT '' AS "160", d.f1 AS "timestamp", t.f1 AS "interval", d.f1 + t.f1 AS plus - FROM TEMP_TIMESTAMP d, INTERVAL_TBL t - ORDER BY plus, "timestamp", "interval"; - 160 | timestamp | interval | plus ------+------------------------------+-------------------------------+------------------------------ - | Thu Jan 01 00:00:00 1970 PST | @ 14 secs ago | Wed Dec 31 23:59:46 1969 PST - | Thu Jan 01 00:00:00 1970 PST | @ 1 min | Thu Jan 01 00:01:00 1970 PST - | Thu Jan 01 00:00:00 1970 PST | @ 5 hours | Thu Jan 01 05:00:00 1970 PST - | Thu Jan 01 00:00:00 1970 PST | @ 1 day 2 hours 3 mins 4 secs | Fri Jan 02 02:03:04 1970 PST - | Thu Jan 01 00:00:00 1970 PST | @ 10 days | Sun Jan 11 00:00:00 1970 PST - | Thu Jan 01 00:00:00 1970 PST | @ 3 mons | Wed Apr 01 00:00:00 1970 PST - | Thu Jan 01 00:00:00 1970 PST | @ 5 mons | Mon Jun 01 00:00:00 1970 PDT - | Thu Jan 01 00:00:00 1970 PST | @ 5 mons 12 hours | Mon Jun 01 12:00:00 1970 PDT - | Thu Jan 01 00:00:00 1970 PST | @ 6 years | Thu Jan 01 00:00:00 1976 PST - | Wed Feb 28 17:32:01 1996 PST | @ 14 secs ago | Wed Feb 28 17:31:47 1996 PST - | Wed Feb 28 17:32:01 1996 PST | @ 1 min | Wed Feb 28 17:33:01 1996 PST - | Wed Feb 28 17:32:01 1996 PST | @ 5 hours | Wed Feb 28 22:32:01 1996 PST - | Thu Feb 29 17:32:01 1996 PST | @ 14 secs ago | Thu Feb 29 17:31:47 1996 PST - | Thu Feb 29 17:32:01 1996 PST | @ 1 min | Thu Feb 29 17:33:01 1996 PST - | Wed Feb 28 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Feb 29 19:35:05 1996 PST - | Thu Feb 29 17:32:01 1996 PST | @ 5 hours | Thu Feb 29 22:32:01 1996 PST - | Fri Mar 01 17:32:01 1996 PST | @ 14 secs ago | Fri Mar 01 17:31:47 1996 PST - | Fri Mar 01 17:32:01 1996 PST | @ 1 min | Fri Mar 01 17:33:01 1996 PST - | Thu Feb 29 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Fri Mar 01 19:35:05 1996 PST - | Fri Mar 01 17:32:01 1996 PST | @ 5 hours | Fri Mar 01 22:32:01 1996 PST - | Fri Mar 01 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Sat Mar 02 19:35:05 1996 PST - | Wed Feb 28 17:32:01 1996 PST | @ 10 days | Sat Mar 09 17:32:01 1996 PST - | Thu Feb 29 17:32:01 1996 PST | @ 10 days | Sun Mar 10 17:32:01 1996 PST - | Fri Mar 01 17:32:01 1996 PST | @ 10 days | Mon Mar 11 17:32:01 1996 PST - | Wed Feb 28 17:32:01 1996 PST | @ 3 mons | Tue May 28 17:32:01 1996 PDT - | Thu Feb 29 17:32:01 1996 PST | @ 3 mons | Wed May 29 17:32:01 1996 PDT - | Fri Mar 01 17:32:01 1996 PST | @ 3 mons | Sat Jun 01 17:32:01 1996 PDT - | Wed Feb 28 17:32:01 1996 PST | @ 5 mons | Sun Jul 28 17:32:01 1996 PDT - | Wed Feb 28 17:32:01 1996 PST | @ 5 mons 12 hours | Mon Jul 29 05:32:01 1996 PDT - | Thu Feb 29 17:32:01 1996 PST | @ 5 mons | Mon Jul 29 17:32:01 1996 PDT - | Thu Feb 29 17:32:01 1996 PST | @ 5 mons 12 hours | Tue Jul 30 05:32:01 1996 PDT - | Fri Mar 01 17:32:01 1996 PST | @ 5 mons | Thu Aug 01 17:32:01 1996 PDT - | Fri Mar 01 17:32:01 1996 PST | @ 5 mons 12 hours | Fri Aug 02 05:32:01 1996 PDT - | Mon Dec 30 17:32:01 1996 PST | @ 14 secs ago | Mon Dec 30 17:31:47 1996 PST - | Mon Dec 30 17:32:01 1996 PST | @ 1 min | Mon Dec 30 17:33:01 1996 PST - | Mon Dec 30 17:32:01 1996 PST | @ 5 hours | Mon Dec 30 22:32:01 1996 PST - | Tue Dec 31 17:32:01 1996 PST | @ 14 secs ago | Tue Dec 31 17:31:47 1996 PST - | Tue Dec 31 17:32:01 1996 PST | @ 1 min | Tue Dec 31 17:33:01 1996 PST - | Mon Dec 30 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Dec 31 19:35:05 1996 PST - | Tue Dec 31 17:32:01 1996 PST | @ 5 hours | Tue Dec 31 22:32:01 1996 PST - | Tue Dec 31 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Wed Jan 01 19:35:05 1997 PST - | Mon Dec 30 17:32:01 1996 PST | @ 10 days | Thu Jan 09 17:32:01 1997 PST - | Tue Dec 31 17:32:01 1996 PST | @ 10 days | Fri Jan 10 17:32:01 1997 PST - | Mon Dec 30 17:32:01 1996 PST | @ 3 mons | Sun Mar 30 17:32:01 1997 PST - | Tue Dec 31 17:32:01 1996 PST | @ 3 mons | Mon Mar 31 17:32:01 1997 PST - | Mon Dec 30 17:32:01 1996 PST | @ 5 mons | Fri May 30 17:32:01 1997 PDT - | Mon Dec 30 17:32:01 1996 PST | @ 5 mons 12 hours | Sat May 31 05:32:01 1997 PDT - | Tue Dec 31 17:32:01 1996 PST | @ 5 mons | Sat May 31 17:32:01 1997 PDT - | Tue Dec 31 17:32:01 1996 PST | @ 5 mons 12 hours | Sun Jun 01 05:32:01 1997 PDT - | Fri Dec 31 17:32:01 1999 PST | @ 14 secs ago | Fri Dec 31 17:31:47 1999 PST - | Fri Dec 31 17:32:01 1999 PST | @ 1 min | Fri Dec 31 17:33:01 1999 PST - | Fri Dec 31 17:32:01 1999 PST | @ 5 hours | Fri Dec 31 22:32:01 1999 PST - | Sat Jan 01 17:32:01 2000 PST | @ 14 secs ago | Sat Jan 01 17:31:47 2000 PST - | Sat Jan 01 17:32:01 2000 PST | @ 1 min | Sat Jan 01 17:33:01 2000 PST - | Fri Dec 31 17:32:01 1999 PST | @ 1 day 2 hours 3 mins 4 secs | Sat Jan 01 19:35:05 2000 PST - | Sat Jan 01 17:32:01 2000 PST | @ 5 hours | Sat Jan 01 22:32:01 2000 PST - | Sat Jan 01 17:32:01 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Sun Jan 02 19:35:05 2000 PST - | Fri Dec 31 17:32:01 1999 PST | @ 10 days | Mon Jan 10 17:32:01 2000 PST - | Sat Jan 01 17:32:01 2000 PST | @ 10 days | Tue Jan 11 17:32:01 2000 PST - | Wed Mar 15 02:14:05 2000 PST | @ 14 secs ago | Wed Mar 15 02:13:51 2000 PST - | Wed Mar 15 02:14:05 2000 PST | @ 1 min | Wed Mar 15 02:15:05 2000 PST - | Wed Mar 15 03:14:04 2000 PST | @ 14 secs ago | Wed Mar 15 03:13:50 2000 PST - | Wed Mar 15 03:14:04 2000 PST | @ 1 min | Wed Mar 15 03:15:04 2000 PST - | Wed Mar 15 02:14:05 2000 PST | @ 5 hours | Wed Mar 15 07:14:05 2000 PST - | Wed Mar 15 08:14:01 2000 PST | @ 14 secs ago | Wed Mar 15 08:13:47 2000 PST - | Wed Mar 15 03:14:04 2000 PST | @ 5 hours | Wed Mar 15 08:14:04 2000 PST - | Wed Mar 15 08:14:01 2000 PST | @ 1 min | Wed Mar 15 08:15:01 2000 PST - | Wed Mar 15 12:14:03 2000 PST | @ 14 secs ago | Wed Mar 15 12:13:49 2000 PST - | Wed Mar 15 12:14:03 2000 PST | @ 1 min | Wed Mar 15 12:15:03 2000 PST - | Wed Mar 15 13:14:02 2000 PST | @ 14 secs ago | Wed Mar 15 13:13:48 2000 PST - | Wed Mar 15 08:14:01 2000 PST | @ 5 hours | Wed Mar 15 13:14:01 2000 PST - | Wed Mar 15 13:14:02 2000 PST | @ 1 min | Wed Mar 15 13:15:02 2000 PST - | Wed Mar 15 12:14:03 2000 PST | @ 5 hours | Wed Mar 15 17:14:03 2000 PST - | Wed Mar 15 13:14:02 2000 PST | @ 5 hours | Wed Mar 15 18:14:02 2000 PST - | Wed Mar 15 02:14:05 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Mar 16 04:17:09 2000 PST - | Wed Mar 15 03:14:04 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Mar 16 05:17:08 2000 PST - | Wed Mar 15 08:14:01 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Mar 16 10:17:05 2000 PST - | Wed Mar 15 12:14:03 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Mar 16 14:17:07 2000 PST - | Wed Mar 15 13:14:02 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Mar 16 15:17:06 2000 PST - | Wed Mar 15 02:14:05 2000 PST | @ 10 days | Sat Mar 25 02:14:05 2000 PST - | Wed Mar 15 03:14:04 2000 PST | @ 10 days | Sat Mar 25 03:14:04 2000 PST - | Wed Mar 15 08:14:01 2000 PST | @ 10 days | Sat Mar 25 08:14:01 2000 PST - | Wed Mar 15 12:14:03 2000 PST | @ 10 days | Sat Mar 25 12:14:03 2000 PST - | Wed Mar 15 13:14:02 2000 PST | @ 10 days | Sat Mar 25 13:14:02 2000 PST - | Fri Dec 31 17:32:01 1999 PST | @ 3 mons | Fri Mar 31 17:32:01 2000 PST - | Sat Jan 01 17:32:01 2000 PST | @ 3 mons | Sat Apr 01 17:32:01 2000 PST - | Fri Dec 31 17:32:01 1999 PST | @ 5 mons | Wed May 31 17:32:01 2000 PDT - | Fri Dec 31 17:32:01 1999 PST | @ 5 mons 12 hours | Thu Jun 01 05:32:01 2000 PDT - | Sat Jan 01 17:32:01 2000 PST | @ 5 mons | Thu Jun 01 17:32:01 2000 PDT - | Sat Jan 01 17:32:01 2000 PST | @ 5 mons 12 hours | Fri Jun 02 05:32:01 2000 PDT - | Wed Mar 15 02:14:05 2000 PST | @ 3 mons | Thu Jun 15 02:14:05 2000 PDT - | Wed Mar 15 03:14:04 2000 PST | @ 3 mons | Thu Jun 15 03:14:04 2000 PDT - | Wed Mar 15 08:14:01 2000 PST | @ 3 mons | Thu Jun 15 08:14:01 2000 PDT - | Wed Mar 15 12:14:03 2000 PST | @ 3 mons | Thu Jun 15 12:14:03 2000 PDT - | Wed Mar 15 13:14:02 2000 PST | @ 3 mons | Thu Jun 15 13:14:02 2000 PDT - | Wed Mar 15 02:14:05 2000 PST | @ 5 mons | Tue Aug 15 02:14:05 2000 PDT - | Wed Mar 15 03:14:04 2000 PST | @ 5 mons | Tue Aug 15 03:14:04 2000 PDT - | Wed Mar 15 08:14:01 2000 PST | @ 5 mons | Tue Aug 15 08:14:01 2000 PDT - | Wed Mar 15 12:14:03 2000 PST | @ 5 mons | Tue Aug 15 12:14:03 2000 PDT - | Wed Mar 15 13:14:02 2000 PST | @ 5 mons | Tue Aug 15 13:14:02 2000 PDT - | Wed Mar 15 02:14:05 2000 PST | @ 5 mons 12 hours | Tue Aug 15 14:14:05 2000 PDT - | Wed Mar 15 03:14:04 2000 PST | @ 5 mons 12 hours | Tue Aug 15 15:14:04 2000 PDT - | Wed Mar 15 08:14:01 2000 PST | @ 5 mons 12 hours | Tue Aug 15 20:14:01 2000 PDT - | Wed Mar 15 12:14:03 2000 PST | @ 5 mons 12 hours | Wed Aug 16 00:14:03 2000 PDT - | Wed Mar 15 13:14:02 2000 PST | @ 5 mons 12 hours | Wed Aug 16 01:14:02 2000 PDT - | Sun Dec 31 17:32:01 2000 PST | @ 14 secs ago | Sun Dec 31 17:31:47 2000 PST - | Sun Dec 31 17:32:01 2000 PST | @ 1 min | Sun Dec 31 17:33:01 2000 PST - | Sun Dec 31 17:32:01 2000 PST | @ 5 hours | Sun Dec 31 22:32:01 2000 PST - | Mon Jan 01 17:32:01 2001 PST | @ 14 secs ago | Mon Jan 01 17:31:47 2001 PST - | Mon Jan 01 17:32:01 2001 PST | @ 1 min | Mon Jan 01 17:33:01 2001 PST - | Sun Dec 31 17:32:01 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Mon Jan 01 19:35:05 2001 PST - | Mon Jan 01 17:32:01 2001 PST | @ 5 hours | Mon Jan 01 22:32:01 2001 PST - | Mon Jan 01 17:32:01 2001 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Jan 02 19:35:05 2001 PST - | Sun Dec 31 17:32:01 2000 PST | @ 10 days | Wed Jan 10 17:32:01 2001 PST - | Mon Jan 01 17:32:01 2001 PST | @ 10 days | Thu Jan 11 17:32:01 2001 PST - | Sun Dec 31 17:32:01 2000 PST | @ 3 mons | Sat Mar 31 17:32:01 2001 PST - | Mon Jan 01 17:32:01 2001 PST | @ 3 mons | Sun Apr 01 17:32:01 2001 PDT - | Sun Dec 31 17:32:01 2000 PST | @ 5 mons | Thu May 31 17:32:01 2001 PDT - | Sun Dec 31 17:32:01 2000 PST | @ 5 mons 12 hours | Fri Jun 01 05:32:01 2001 PDT - | Mon Jan 01 17:32:01 2001 PST | @ 5 mons | Fri Jun 01 17:32:01 2001 PDT - | Mon Jan 01 17:32:01 2001 PST | @ 5 mons 12 hours | Sat Jun 02 05:32:01 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 14 secs ago | Sat Sep 22 18:19:06 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 1 min | Sat Sep 22 18:20:20 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 5 hours | Sat Sep 22 23:19:20 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 1 day 2 hours 3 mins 4 secs | Sun Sep 23 20:22:24 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 10 days | Tue Oct 02 18:19:20 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 3 mons | Sat Dec 22 18:19:20 2001 PST - | Sat Sep 22 18:19:20 2001 PDT | @ 5 mons | Fri Feb 22 18:19:20 2002 PST - | Sat Sep 22 18:19:20 2001 PDT | @ 5 mons 12 hours | Sat Feb 23 06:19:20 2002 PST - | Wed Feb 28 17:32:01 1996 PST | @ 6 years | Thu Feb 28 17:32:01 2002 PST - | Thu Feb 29 17:32:01 1996 PST | @ 6 years | Thu Feb 28 17:32:01 2002 PST - | Fri Mar 01 17:32:01 1996 PST | @ 6 years | Fri Mar 01 17:32:01 2002 PST - | Mon Dec 30 17:32:01 1996 PST | @ 6 years | Mon Dec 30 17:32:01 2002 PST - | Tue Dec 31 17:32:01 1996 PST | @ 6 years | Tue Dec 31 17:32:01 2002 PST - | Thu Jan 01 00:00:00 1970 PST | @ 34 years | Thu Jan 01 00:00:00 2004 PST - | Fri Dec 31 17:32:01 1999 PST | @ 6 years | Sat Dec 31 17:32:01 2005 PST - | Sat Jan 01 17:32:01 2000 PST | @ 6 years | Sun Jan 01 17:32:01 2006 PST - | Wed Mar 15 02:14:05 2000 PST | @ 6 years | Wed Mar 15 02:14:05 2006 PST - | Wed Mar 15 03:14:04 2000 PST | @ 6 years | Wed Mar 15 03:14:04 2006 PST - | Wed Mar 15 08:14:01 2000 PST | @ 6 years | Wed Mar 15 08:14:01 2006 PST - | Wed Mar 15 12:14:03 2000 PST | @ 6 years | Wed Mar 15 12:14:03 2006 PST - | Wed Mar 15 13:14:02 2000 PST | @ 6 years | Wed Mar 15 13:14:02 2006 PST - | Sun Dec 31 17:32:01 2000 PST | @ 6 years | Sun Dec 31 17:32:01 2006 PST - | Mon Jan 01 17:32:01 2001 PST | @ 6 years | Mon Jan 01 17:32:01 2007 PST - | Sat Sep 22 18:19:20 2001 PDT | @ 6 years | Sat Sep 22 18:19:20 2007 PDT - | Wed Feb 28 17:32:01 1996 PST | @ 34 years | Thu Feb 28 17:32:01 2030 PST - | Thu Feb 29 17:32:01 1996 PST | @ 34 years | Thu Feb 28 17:32:01 2030 PST - | Fri Mar 01 17:32:01 1996 PST | @ 34 years | Fri Mar 01 17:32:01 2030 PST - | Mon Dec 30 17:32:01 1996 PST | @ 34 years | Mon Dec 30 17:32:01 2030 PST - | Tue Dec 31 17:32:01 1996 PST | @ 34 years | Tue Dec 31 17:32:01 2030 PST - | Fri Dec 31 17:32:01 1999 PST | @ 34 years | Sat Dec 31 17:32:01 2033 PST - | Sat Jan 01 17:32:01 2000 PST | @ 34 years | Sun Jan 01 17:32:01 2034 PST - | Wed Mar 15 02:14:05 2000 PST | @ 34 years | Wed Mar 15 02:14:05 2034 PST - | Wed Mar 15 03:14:04 2000 PST | @ 34 years | Wed Mar 15 03:14:04 2034 PST - | Wed Mar 15 08:14:01 2000 PST | @ 34 years | Wed Mar 15 08:14:01 2034 PST - | Wed Mar 15 12:14:03 2000 PST | @ 34 years | Wed Mar 15 12:14:03 2034 PST - | Wed Mar 15 13:14:02 2000 PST | @ 34 years | Wed Mar 15 13:14:02 2034 PST - | Sun Dec 31 17:32:01 2000 PST | @ 34 years | Sun Dec 31 17:32:01 2034 PST - | Mon Jan 01 17:32:01 2001 PST | @ 34 years | Mon Jan 01 17:32:01 2035 PST - | Sat Sep 22 18:19:20 2001 PDT | @ 34 years | Sat Sep 22 18:19:20 2035 PDT -(160 rows) - -SELECT '' AS "160", d.f1 AS "timestamp", t.f1 AS "interval", d.f1 - t.f1 AS minus - FROM TEMP_TIMESTAMP d, INTERVAL_TBL t - WHERE isfinite(d.f1) - ORDER BY minus, "timestamp", "interval"; - 160 | timestamp | interval | minus ------+------------------------------+-------------------------------+------------------------------ - | Thu Jan 01 00:00:00 1970 PST | @ 34 years | Wed Jan 01 00:00:00 1936 PST - | Wed Feb 28 17:32:01 1996 PST | @ 34 years | Wed Feb 28 17:32:01 1962 PST - | Thu Feb 29 17:32:01 1996 PST | @ 34 years | Wed Feb 28 17:32:01 1962 PST - | Fri Mar 01 17:32:01 1996 PST | @ 34 years | Thu Mar 01 17:32:01 1962 PST - | Mon Dec 30 17:32:01 1996 PST | @ 34 years | Sun Dec 30 17:32:01 1962 PST - | Tue Dec 31 17:32:01 1996 PST | @ 34 years | Mon Dec 31 17:32:01 1962 PST - | Thu Jan 01 00:00:00 1970 PST | @ 6 years | Wed Jan 01 00:00:00 1964 PST - | Fri Dec 31 17:32:01 1999 PST | @ 34 years | Fri Dec 31 17:32:01 1965 PST - | Sat Jan 01 17:32:01 2000 PST | @ 34 years | Sat Jan 01 17:32:01 1966 PST - | Wed Mar 15 02:14:05 2000 PST | @ 34 years | Tue Mar 15 02:14:05 1966 PST - | Wed Mar 15 03:14:04 2000 PST | @ 34 years | Tue Mar 15 03:14:04 1966 PST - | Wed Mar 15 08:14:01 2000 PST | @ 34 years | Tue Mar 15 08:14:01 1966 PST - | Wed Mar 15 12:14:03 2000 PST | @ 34 years | Tue Mar 15 12:14:03 1966 PST - | Wed Mar 15 13:14:02 2000 PST | @ 34 years | Tue Mar 15 13:14:02 1966 PST - | Sun Dec 31 17:32:01 2000 PST | @ 34 years | Sat Dec 31 17:32:01 1966 PST - | Mon Jan 01 17:32:01 2001 PST | @ 34 years | Sun Jan 01 17:32:01 1967 PST - | Sat Sep 22 18:19:20 2001 PDT | @ 34 years | Fri Sep 22 18:19:20 1967 PST - | Thu Jan 01 00:00:00 1970 PST | @ 5 mons 12 hours | Thu Jul 31 12:00:00 1969 PST - | Thu Jan 01 00:00:00 1970 PST | @ 5 mons | Fri Aug 01 00:00:00 1969 PST - | Thu Jan 01 00:00:00 1970 PST | @ 3 mons | Wed Oct 01 00:00:00 1969 PST - | Thu Jan 01 00:00:00 1970 PST | @ 10 days | Mon Dec 22 00:00:00 1969 PST - | Thu Jan 01 00:00:00 1970 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Dec 30 21:56:56 1969 PST - | Thu Jan 01 00:00:00 1970 PST | @ 5 hours | Wed Dec 31 19:00:00 1969 PST - | Thu Jan 01 00:00:00 1970 PST | @ 1 min | Wed Dec 31 23:59:00 1969 PST - | Thu Jan 01 00:00:00 1970 PST | @ 14 secs ago | Thu Jan 01 00:00:14 1970 PST - | Wed Feb 28 17:32:01 1996 PST | @ 6 years | Wed Feb 28 17:32:01 1990 PST - | Thu Feb 29 17:32:01 1996 PST | @ 6 years | Wed Feb 28 17:32:01 1990 PST - | Fri Mar 01 17:32:01 1996 PST | @ 6 years | Thu Mar 01 17:32:01 1990 PST - | Mon Dec 30 17:32:01 1996 PST | @ 6 years | Sun Dec 30 17:32:01 1990 PST - | Tue Dec 31 17:32:01 1996 PST | @ 6 years | Mon Dec 31 17:32:01 1990 PST - | Fri Dec 31 17:32:01 1999 PST | @ 6 years | Fri Dec 31 17:32:01 1993 PST - | Sat Jan 01 17:32:01 2000 PST | @ 6 years | Sat Jan 01 17:32:01 1994 PST - | Wed Mar 15 02:14:05 2000 PST | @ 6 years | Tue Mar 15 02:14:05 1994 PST - | Wed Mar 15 03:14:04 2000 PST | @ 6 years | Tue Mar 15 03:14:04 1994 PST - | Wed Mar 15 08:14:01 2000 PST | @ 6 years | Tue Mar 15 08:14:01 1994 PST - | Wed Mar 15 12:14:03 2000 PST | @ 6 years | Tue Mar 15 12:14:03 1994 PST - | Wed Mar 15 13:14:02 2000 PST | @ 6 years | Tue Mar 15 13:14:02 1994 PST - | Sun Dec 31 17:32:01 2000 PST | @ 6 years | Sat Dec 31 17:32:01 1994 PST - | Mon Jan 01 17:32:01 2001 PST | @ 6 years | Sun Jan 01 17:32:01 1995 PST - | Sat Sep 22 18:19:20 2001 PDT | @ 6 years | Fri Sep 22 18:19:20 1995 PDT - | Wed Feb 28 17:32:01 1996 PST | @ 5 mons 12 hours | Thu Sep 28 05:32:01 1995 PDT - | Wed Feb 28 17:32:01 1996 PST | @ 5 mons | Thu Sep 28 17:32:01 1995 PDT - | Thu Feb 29 17:32:01 1996 PST | @ 5 mons 12 hours | Fri Sep 29 05:32:01 1995 PDT - | Thu Feb 29 17:32:01 1996 PST | @ 5 mons | Fri Sep 29 17:32:01 1995 PDT - | Fri Mar 01 17:32:01 1996 PST | @ 5 mons 12 hours | Sun Oct 01 05:32:01 1995 PDT - | Fri Mar 01 17:32:01 1996 PST | @ 5 mons | Sun Oct 01 17:32:01 1995 PDT - | Wed Feb 28 17:32:01 1996 PST | @ 3 mons | Tue Nov 28 17:32:01 1995 PST - | Thu Feb 29 17:32:01 1996 PST | @ 3 mons | Wed Nov 29 17:32:01 1995 PST - | Fri Mar 01 17:32:01 1996 PST | @ 3 mons | Fri Dec 01 17:32:01 1995 PST - | Wed Feb 28 17:32:01 1996 PST | @ 10 days | Sun Feb 18 17:32:01 1996 PST - | Thu Feb 29 17:32:01 1996 PST | @ 10 days | Mon Feb 19 17:32:01 1996 PST - | Fri Mar 01 17:32:01 1996 PST | @ 10 days | Tue Feb 20 17:32:01 1996 PST - | Wed Feb 28 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Feb 27 15:28:57 1996 PST - | Wed Feb 28 17:32:01 1996 PST | @ 5 hours | Wed Feb 28 12:32:01 1996 PST - | Thu Feb 29 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Wed Feb 28 15:28:57 1996 PST - | Wed Feb 28 17:32:01 1996 PST | @ 1 min | Wed Feb 28 17:31:01 1996 PST - | Wed Feb 28 17:32:01 1996 PST | @ 14 secs ago | Wed Feb 28 17:32:15 1996 PST - | Thu Feb 29 17:32:01 1996 PST | @ 5 hours | Thu Feb 29 12:32:01 1996 PST - | Fri Mar 01 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Feb 29 15:28:57 1996 PST - | Thu Feb 29 17:32:01 1996 PST | @ 1 min | Thu Feb 29 17:31:01 1996 PST - | Thu Feb 29 17:32:01 1996 PST | @ 14 secs ago | Thu Feb 29 17:32:15 1996 PST - | Fri Mar 01 17:32:01 1996 PST | @ 5 hours | Fri Mar 01 12:32:01 1996 PST - | Fri Mar 01 17:32:01 1996 PST | @ 1 min | Fri Mar 01 17:31:01 1996 PST - | Fri Mar 01 17:32:01 1996 PST | @ 14 secs ago | Fri Mar 01 17:32:15 1996 PST - | Mon Dec 30 17:32:01 1996 PST | @ 5 mons 12 hours | Tue Jul 30 05:32:01 1996 PDT - | Mon Dec 30 17:32:01 1996 PST | @ 5 mons | Tue Jul 30 17:32:01 1996 PDT - | Tue Dec 31 17:32:01 1996 PST | @ 5 mons 12 hours | Wed Jul 31 05:32:01 1996 PDT - | Tue Dec 31 17:32:01 1996 PST | @ 5 mons | Wed Jul 31 17:32:01 1996 PDT - | Mon Dec 30 17:32:01 1996 PST | @ 3 mons | Mon Sep 30 17:32:01 1996 PDT - | Tue Dec 31 17:32:01 1996 PST | @ 3 mons | Mon Sep 30 17:32:01 1996 PDT - | Mon Dec 30 17:32:01 1996 PST | @ 10 days | Fri Dec 20 17:32:01 1996 PST - | Tue Dec 31 17:32:01 1996 PST | @ 10 days | Sat Dec 21 17:32:01 1996 PST - | Mon Dec 30 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Sun Dec 29 15:28:57 1996 PST - | Mon Dec 30 17:32:01 1996 PST | @ 5 hours | Mon Dec 30 12:32:01 1996 PST - | Tue Dec 31 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Mon Dec 30 15:28:57 1996 PST - | Mon Dec 30 17:32:01 1996 PST | @ 1 min | Mon Dec 30 17:31:01 1996 PST - | Mon Dec 30 17:32:01 1996 PST | @ 14 secs ago | Mon Dec 30 17:32:15 1996 PST - | Tue Dec 31 17:32:01 1996 PST | @ 5 hours | Tue Dec 31 12:32:01 1996 PST - | Tue Dec 31 17:32:01 1996 PST | @ 1 min | Tue Dec 31 17:31:01 1996 PST - | Tue Dec 31 17:32:01 1996 PST | @ 14 secs ago | Tue Dec 31 17:32:15 1996 PST - | Fri Dec 31 17:32:01 1999 PST | @ 5 mons 12 hours | Sat Jul 31 05:32:01 1999 PDT - | Fri Dec 31 17:32:01 1999 PST | @ 5 mons | Sat Jul 31 17:32:01 1999 PDT - | Sat Jan 01 17:32:01 2000 PST | @ 5 mons 12 hours | Sun Aug 01 05:32:01 1999 PDT - | Sat Jan 01 17:32:01 2000 PST | @ 5 mons | Sun Aug 01 17:32:01 1999 PDT - | Fri Dec 31 17:32:01 1999 PST | @ 3 mons | Thu Sep 30 17:32:01 1999 PDT - | Sat Jan 01 17:32:01 2000 PST | @ 3 mons | Fri Oct 01 17:32:01 1999 PDT - | Wed Mar 15 02:14:05 2000 PST | @ 5 mons 12 hours | Thu Oct 14 14:14:05 1999 PDT - | Wed Mar 15 03:14:04 2000 PST | @ 5 mons 12 hours | Thu Oct 14 15:14:04 1999 PDT - | Wed Mar 15 08:14:01 2000 PST | @ 5 mons 12 hours | Thu Oct 14 20:14:01 1999 PDT - | Wed Mar 15 12:14:03 2000 PST | @ 5 mons 12 hours | Fri Oct 15 00:14:03 1999 PDT - | Wed Mar 15 13:14:02 2000 PST | @ 5 mons 12 hours | Fri Oct 15 01:14:02 1999 PDT - | Wed Mar 15 02:14:05 2000 PST | @ 5 mons | Fri Oct 15 02:14:05 1999 PDT - | Wed Mar 15 03:14:04 2000 PST | @ 5 mons | Fri Oct 15 03:14:04 1999 PDT - | Wed Mar 15 08:14:01 2000 PST | @ 5 mons | Fri Oct 15 08:14:01 1999 PDT - | Wed Mar 15 12:14:03 2000 PST | @ 5 mons | Fri Oct 15 12:14:03 1999 PDT - | Wed Mar 15 13:14:02 2000 PST | @ 5 mons | Fri Oct 15 13:14:02 1999 PDT - | Wed Mar 15 02:14:05 2000 PST | @ 3 mons | Wed Dec 15 02:14:05 1999 PST - | Wed Mar 15 03:14:04 2000 PST | @ 3 mons | Wed Dec 15 03:14:04 1999 PST - | Wed Mar 15 08:14:01 2000 PST | @ 3 mons | Wed Dec 15 08:14:01 1999 PST - | Wed Mar 15 12:14:03 2000 PST | @ 3 mons | Wed Dec 15 12:14:03 1999 PST - | Wed Mar 15 13:14:02 2000 PST | @ 3 mons | Wed Dec 15 13:14:02 1999 PST - | Fri Dec 31 17:32:01 1999 PST | @ 10 days | Tue Dec 21 17:32:01 1999 PST - | Sat Jan 01 17:32:01 2000 PST | @ 10 days | Wed Dec 22 17:32:01 1999 PST - | Fri Dec 31 17:32:01 1999 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Dec 30 15:28:57 1999 PST - | Fri Dec 31 17:32:01 1999 PST | @ 5 hours | Fri Dec 31 12:32:01 1999 PST - | Sat Jan 01 17:32:01 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Fri Dec 31 15:28:57 1999 PST - | Fri Dec 31 17:32:01 1999 PST | @ 1 min | Fri Dec 31 17:31:01 1999 PST - | Fri Dec 31 17:32:01 1999 PST | @ 14 secs ago | Fri Dec 31 17:32:15 1999 PST - | Sat Jan 01 17:32:01 2000 PST | @ 5 hours | Sat Jan 01 12:32:01 2000 PST - | Sat Jan 01 17:32:01 2000 PST | @ 1 min | Sat Jan 01 17:31:01 2000 PST - | Sat Jan 01 17:32:01 2000 PST | @ 14 secs ago | Sat Jan 01 17:32:15 2000 PST - | Wed Mar 15 02:14:05 2000 PST | @ 10 days | Sun Mar 05 02:14:05 2000 PST - | Wed Mar 15 03:14:04 2000 PST | @ 10 days | Sun Mar 05 03:14:04 2000 PST - | Wed Mar 15 08:14:01 2000 PST | @ 10 days | Sun Mar 05 08:14:01 2000 PST - | Wed Mar 15 12:14:03 2000 PST | @ 10 days | Sun Mar 05 12:14:03 2000 PST - | Wed Mar 15 13:14:02 2000 PST | @ 10 days | Sun Mar 05 13:14:02 2000 PST - | Wed Mar 15 02:14:05 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Mar 14 00:11:01 2000 PST - | Wed Mar 15 03:14:04 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Mar 14 01:11:00 2000 PST - | Wed Mar 15 08:14:01 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Mar 14 06:10:57 2000 PST - | Wed Mar 15 12:14:03 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Mar 14 10:10:59 2000 PST - | Wed Mar 15 13:14:02 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Mar 14 11:10:58 2000 PST - | Wed Mar 15 02:14:05 2000 PST | @ 5 hours | Tue Mar 14 21:14:05 2000 PST - | Wed Mar 15 03:14:04 2000 PST | @ 5 hours | Tue Mar 14 22:14:04 2000 PST - | Wed Mar 15 02:14:05 2000 PST | @ 1 min | Wed Mar 15 02:13:05 2000 PST - | Wed Mar 15 02:14:05 2000 PST | @ 14 secs ago | Wed Mar 15 02:14:19 2000 PST - | Wed Mar 15 03:14:04 2000 PST | @ 1 min | Wed Mar 15 03:13:04 2000 PST - | Wed Mar 15 08:14:01 2000 PST | @ 5 hours | Wed Mar 15 03:14:01 2000 PST - | Wed Mar 15 03:14:04 2000 PST | @ 14 secs ago | Wed Mar 15 03:14:18 2000 PST - | Wed Mar 15 12:14:03 2000 PST | @ 5 hours | Wed Mar 15 07:14:03 2000 PST - | Wed Mar 15 08:14:01 2000 PST | @ 1 min | Wed Mar 15 08:13:01 2000 PST - | Wed Mar 15 13:14:02 2000 PST | @ 5 hours | Wed Mar 15 08:14:02 2000 PST - | Wed Mar 15 08:14:01 2000 PST | @ 14 secs ago | Wed Mar 15 08:14:15 2000 PST - | Wed Mar 15 12:14:03 2000 PST | @ 1 min | Wed Mar 15 12:13:03 2000 PST - | Wed Mar 15 12:14:03 2000 PST | @ 14 secs ago | Wed Mar 15 12:14:17 2000 PST - | Wed Mar 15 13:14:02 2000 PST | @ 1 min | Wed Mar 15 13:13:02 2000 PST - | Wed Mar 15 13:14:02 2000 PST | @ 14 secs ago | Wed Mar 15 13:14:16 2000 PST - | Sun Dec 31 17:32:01 2000 PST | @ 5 mons 12 hours | Mon Jul 31 05:32:01 2000 PDT - | Sun Dec 31 17:32:01 2000 PST | @ 5 mons | Mon Jul 31 17:32:01 2000 PDT - | Mon Jan 01 17:32:01 2001 PST | @ 5 mons 12 hours | Tue Aug 01 05:32:01 2000 PDT - | Mon Jan 01 17:32:01 2001 PST | @ 5 mons | Tue Aug 01 17:32:01 2000 PDT - | Sun Dec 31 17:32:01 2000 PST | @ 3 mons | Sat Sep 30 17:32:01 2000 PDT - | Mon Jan 01 17:32:01 2001 PST | @ 3 mons | Sun Oct 01 17:32:01 2000 PDT - | Sun Dec 31 17:32:01 2000 PST | @ 10 days | Thu Dec 21 17:32:01 2000 PST - | Mon Jan 01 17:32:01 2001 PST | @ 10 days | Fri Dec 22 17:32:01 2000 PST - | Sun Dec 31 17:32:01 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Sat Dec 30 15:28:57 2000 PST - | Sun Dec 31 17:32:01 2000 PST | @ 5 hours | Sun Dec 31 12:32:01 2000 PST - | Mon Jan 01 17:32:01 2001 PST | @ 1 day 2 hours 3 mins 4 secs | Sun Dec 31 15:28:57 2000 PST - | Sun Dec 31 17:32:01 2000 PST | @ 1 min | Sun Dec 31 17:31:01 2000 PST - | Sun Dec 31 17:32:01 2000 PST | @ 14 secs ago | Sun Dec 31 17:32:15 2000 PST - | Mon Jan 01 17:32:01 2001 PST | @ 5 hours | Mon Jan 01 12:32:01 2001 PST - | Mon Jan 01 17:32:01 2001 PST | @ 1 min | Mon Jan 01 17:31:01 2001 PST - | Mon Jan 01 17:32:01 2001 PST | @ 14 secs ago | Mon Jan 01 17:32:15 2001 PST - | Sat Sep 22 18:19:20 2001 PDT | @ 5 mons 12 hours | Sun Apr 22 06:19:20 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 5 mons | Sun Apr 22 18:19:20 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 3 mons | Fri Jun 22 18:19:20 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 10 days | Wed Sep 12 18:19:20 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 1 day 2 hours 3 mins 4 secs | Fri Sep 21 16:16:16 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 5 hours | Sat Sep 22 13:19:20 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 1 min | Sat Sep 22 18:18:20 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 14 secs ago | Sat Sep 22 18:19:34 2001 PDT -(160 rows) - -SELECT '' AS "16", d.f1 AS "timestamp", - timestamp with time zone '1980-01-06 00:00 GMT' AS gpstime_zero, - d.f1 - timestamp with time zone '1980-01-06 00:00 GMT' AS difference - FROM TEMP_TIMESTAMP d - ORDER BY difference; - 16 | timestamp | gpstime_zero | difference -----+------------------------------+------------------------------+------------------------------------- - | Thu Jan 01 00:00:00 1970 PST | Sat Jan 05 16:00:00 1980 PST | @ 3656 days 16 hours ago - | Wed Feb 28 17:32:01 1996 PST | Sat Jan 05 16:00:00 1980 PST | @ 5898 days 1 hour 32 mins 1 sec - | Thu Feb 29 17:32:01 1996 PST | Sat Jan 05 16:00:00 1980 PST | @ 5899 days 1 hour 32 mins 1 sec - | Fri Mar 01 17:32:01 1996 PST | Sat Jan 05 16:00:00 1980 PST | @ 5900 days 1 hour 32 mins 1 sec - | Mon Dec 30 17:32:01 1996 PST | Sat Jan 05 16:00:00 1980 PST | @ 6204 days 1 hour 32 mins 1 sec - | Tue Dec 31 17:32:01 1996 PST | Sat Jan 05 16:00:00 1980 PST | @ 6205 days 1 hour 32 mins 1 sec - | Fri Dec 31 17:32:01 1999 PST | Sat Jan 05 16:00:00 1980 PST | @ 7300 days 1 hour 32 mins 1 sec - | Sat Jan 01 17:32:01 2000 PST | Sat Jan 05 16:00:00 1980 PST | @ 7301 days 1 hour 32 mins 1 sec - | Wed Mar 15 02:14:05 2000 PST | Sat Jan 05 16:00:00 1980 PST | @ 7374 days 10 hours 14 mins 5 secs - | Wed Mar 15 03:14:04 2000 PST | Sat Jan 05 16:00:00 1980 PST | @ 7374 days 11 hours 14 mins 4 secs - | Wed Mar 15 08:14:01 2000 PST | Sat Jan 05 16:00:00 1980 PST | @ 7374 days 16 hours 14 mins 1 sec - | Wed Mar 15 12:14:03 2000 PST | Sat Jan 05 16:00:00 1980 PST | @ 7374 days 20 hours 14 mins 3 secs - | Wed Mar 15 13:14:02 2000 PST | Sat Jan 05 16:00:00 1980 PST | @ 7374 days 21 hours 14 mins 2 secs - | Sun Dec 31 17:32:01 2000 PST | Sat Jan 05 16:00:00 1980 PST | @ 7666 days 1 hour 32 mins 1 sec - | Mon Jan 01 17:32:01 2001 PST | Sat Jan 05 16:00:00 1980 PST | @ 7667 days 1 hour 32 mins 1 sec - | Sat Sep 22 18:19:20 2001 PDT | Sat Jan 05 16:00:00 1980 PST | @ 7931 days 1 hour 19 mins 20 secs -(16 rows) - -SELECT '' AS "226", d1.f1 AS timestamp1, d2.f1 AS timestamp2, d1.f1 - d2.f1 AS difference - FROM TEMP_TIMESTAMP d1, TEMP_TIMESTAMP d2 - ORDER BY timestamp1, timestamp2, difference; - 226 | timestamp1 | timestamp2 | difference ------+------------------------------+------------------------------+------------------------------------------- - | Thu Jan 01 00:00:00 1970 PST | Thu Jan 01 00:00:00 1970 PST | @ 0 - | Thu Jan 01 00:00:00 1970 PST | Wed Feb 28 17:32:01 1996 PST | @ 9554 days 17 hours 32 mins 1 sec ago - | Thu Jan 01 00:00:00 1970 PST | Thu Feb 29 17:32:01 1996 PST | @ 9555 days 17 hours 32 mins 1 sec ago - | Thu Jan 01 00:00:00 1970 PST | Fri Mar 01 17:32:01 1996 PST | @ 9556 days 17 hours 32 mins 1 sec ago - | Thu Jan 01 00:00:00 1970 PST | Mon Dec 30 17:32:01 1996 PST | @ 9860 days 17 hours 32 mins 1 sec ago - | Thu Jan 01 00:00:00 1970 PST | Tue Dec 31 17:32:01 1996 PST | @ 9861 days 17 hours 32 mins 1 sec ago - | Thu Jan 01 00:00:00 1970 PST | Fri Dec 31 17:32:01 1999 PST | @ 10956 days 17 hours 32 mins 1 sec ago - | Thu Jan 01 00:00:00 1970 PST | Sat Jan 01 17:32:01 2000 PST | @ 10957 days 17 hours 32 mins 1 sec ago - | Thu Jan 01 00:00:00 1970 PST | Wed Mar 15 02:14:05 2000 PST | @ 11031 days 2 hours 14 mins 5 secs ago - | Thu Jan 01 00:00:00 1970 PST | Wed Mar 15 03:14:04 2000 PST | @ 11031 days 3 hours 14 mins 4 secs ago - | Thu Jan 01 00:00:00 1970 PST | Wed Mar 15 08:14:01 2000 PST | @ 11031 days 8 hours 14 mins 1 sec ago - | Thu Jan 01 00:00:00 1970 PST | Wed Mar 15 12:14:03 2000 PST | @ 11031 days 12 hours 14 mins 3 secs ago - | Thu Jan 01 00:00:00 1970 PST | Wed Mar 15 13:14:02 2000 PST | @ 11031 days 13 hours 14 mins 2 secs ago - | Thu Jan 01 00:00:00 1970 PST | Sun Dec 31 17:32:01 2000 PST | @ 11322 days 17 hours 32 mins 1 sec ago - | Thu Jan 01 00:00:00 1970 PST | Mon Jan 01 17:32:01 2001 PST | @ 11323 days 17 hours 32 mins 1 sec ago - | Thu Jan 01 00:00:00 1970 PST | Sat Sep 22 18:19:20 2001 PDT | @ 11587 days 17 hours 19 mins 20 secs ago - | Wed Feb 28 17:32:01 1996 PST | Thu Jan 01 00:00:00 1970 PST | @ 9554 days 17 hours 32 mins 1 sec - | Wed Feb 28 17:32:01 1996 PST | Wed Feb 28 17:32:01 1996 PST | @ 0 - | Wed Feb 28 17:32:01 1996 PST | Thu Feb 29 17:32:01 1996 PST | @ 1 day ago - | Wed Feb 28 17:32:01 1996 PST | Fri Mar 01 17:32:01 1996 PST | @ 2 days ago - | Wed Feb 28 17:32:01 1996 PST | Mon Dec 30 17:32:01 1996 PST | @ 306 days ago - | Wed Feb 28 17:32:01 1996 PST | Tue Dec 31 17:32:01 1996 PST | @ 307 days ago - | Wed Feb 28 17:32:01 1996 PST | Fri Dec 31 17:32:01 1999 PST | @ 1402 days ago - | Wed Feb 28 17:32:01 1996 PST | Sat Jan 01 17:32:01 2000 PST | @ 1403 days ago - | Wed Feb 28 17:32:01 1996 PST | Wed Mar 15 02:14:05 2000 PST | @ 1476 days 8 hours 42 mins 4 secs ago - | Wed Feb 28 17:32:01 1996 PST | Wed Mar 15 03:14:04 2000 PST | @ 1476 days 9 hours 42 mins 3 secs ago - | Wed Feb 28 17:32:01 1996 PST | Wed Mar 15 08:14:01 2000 PST | @ 1476 days 14 hours 42 mins ago - | Wed Feb 28 17:32:01 1996 PST | Wed Mar 15 12:14:03 2000 PST | @ 1476 days 18 hours 42 mins 2 secs ago - | Wed Feb 28 17:32:01 1996 PST | Wed Mar 15 13:14:02 2000 PST | @ 1476 days 19 hours 42 mins 1 sec ago - | Wed Feb 28 17:32:01 1996 PST | Sun Dec 31 17:32:01 2000 PST | @ 1768 days ago - | Wed Feb 28 17:32:01 1996 PST | Mon Jan 01 17:32:01 2001 PST | @ 1769 days ago - | Wed Feb 28 17:32:01 1996 PST | Sat Sep 22 18:19:20 2001 PDT | @ 2032 days 23 hours 47 mins 19 secs ago - | Thu Feb 29 17:32:01 1996 PST | Thu Jan 01 00:00:00 1970 PST | @ 9555 days 17 hours 32 mins 1 sec - | Thu Feb 29 17:32:01 1996 PST | Wed Feb 28 17:32:01 1996 PST | @ 1 day - | Thu Feb 29 17:32:01 1996 PST | Thu Feb 29 17:32:01 1996 PST | @ 0 - | Thu Feb 29 17:32:01 1996 PST | Fri Mar 01 17:32:01 1996 PST | @ 1 day ago - | Thu Feb 29 17:32:01 1996 PST | Mon Dec 30 17:32:01 1996 PST | @ 305 days ago - | Thu Feb 29 17:32:01 1996 PST | Tue Dec 31 17:32:01 1996 PST | @ 306 days ago - | Thu Feb 29 17:32:01 1996 PST | Fri Dec 31 17:32:01 1999 PST | @ 1401 days ago - | Thu Feb 29 17:32:01 1996 PST | Sat Jan 01 17:32:01 2000 PST | @ 1402 days ago - | Thu Feb 29 17:32:01 1996 PST | Wed Mar 15 02:14:05 2000 PST | @ 1475 days 8 hours 42 mins 4 secs ago - | Thu Feb 29 17:32:01 1996 PST | Wed Mar 15 03:14:04 2000 PST | @ 1475 days 9 hours 42 mins 3 secs ago - | Thu Feb 29 17:32:01 1996 PST | Wed Mar 15 08:14:01 2000 PST | @ 1475 days 14 hours 42 mins ago - | Thu Feb 29 17:32:01 1996 PST | Wed Mar 15 12:14:03 2000 PST | @ 1475 days 18 hours 42 mins 2 secs ago - | Thu Feb 29 17:32:01 1996 PST | Wed Mar 15 13:14:02 2000 PST | @ 1475 days 19 hours 42 mins 1 sec ago - | Thu Feb 29 17:32:01 1996 PST | Sun Dec 31 17:32:01 2000 PST | @ 1767 days ago - | Thu Feb 29 17:32:01 1996 PST | Mon Jan 01 17:32:01 2001 PST | @ 1768 days ago - | Thu Feb 29 17:32:01 1996 PST | Sat Sep 22 18:19:20 2001 PDT | @ 2031 days 23 hours 47 mins 19 secs ago - | Fri Mar 01 17:32:01 1996 PST | Thu Jan 01 00:00:00 1970 PST | @ 9556 days 17 hours 32 mins 1 sec - | Fri Mar 01 17:32:01 1996 PST | Wed Feb 28 17:32:01 1996 PST | @ 2 days - | Fri Mar 01 17:32:01 1996 PST | Thu Feb 29 17:32:01 1996 PST | @ 1 day - | Fri Mar 01 17:32:01 1996 PST | Fri Mar 01 17:32:01 1996 PST | @ 0 - | Fri Mar 01 17:32:01 1996 PST | Mon Dec 30 17:32:01 1996 PST | @ 304 days ago - | Fri Mar 01 17:32:01 1996 PST | Tue Dec 31 17:32:01 1996 PST | @ 305 days ago - | Fri Mar 01 17:32:01 1996 PST | Fri Dec 31 17:32:01 1999 PST | @ 1400 days ago - | Fri Mar 01 17:32:01 1996 PST | Sat Jan 01 17:32:01 2000 PST | @ 1401 days ago - | Fri Mar 01 17:32:01 1996 PST | Wed Mar 15 02:14:05 2000 PST | @ 1474 days 8 hours 42 mins 4 secs ago - | Fri Mar 01 17:32:01 1996 PST | Wed Mar 15 03:14:04 2000 PST | @ 1474 days 9 hours 42 mins 3 secs ago - | Fri Mar 01 17:32:01 1996 PST | Wed Mar 15 08:14:01 2000 PST | @ 1474 days 14 hours 42 mins ago - | Fri Mar 01 17:32:01 1996 PST | Wed Mar 15 12:14:03 2000 PST | @ 1474 days 18 hours 42 mins 2 secs ago - | Fri Mar 01 17:32:01 1996 PST | Wed Mar 15 13:14:02 2000 PST | @ 1474 days 19 hours 42 mins 1 sec ago - | Fri Mar 01 17:32:01 1996 PST | Sun Dec 31 17:32:01 2000 PST | @ 1766 days ago - | Fri Mar 01 17:32:01 1996 PST | Mon Jan 01 17:32:01 2001 PST | @ 1767 days ago - | Fri Mar 01 17:32:01 1996 PST | Sat Sep 22 18:19:20 2001 PDT | @ 2030 days 23 hours 47 mins 19 secs ago - | Mon Dec 30 17:32:01 1996 PST | Thu Jan 01 00:00:00 1970 PST | @ 9860 days 17 hours 32 mins 1 sec - | Mon Dec 30 17:32:01 1996 PST | Wed Feb 28 17:32:01 1996 PST | @ 306 days - | Mon Dec 30 17:32:01 1996 PST | Thu Feb 29 17:32:01 1996 PST | @ 305 days - | Mon Dec 30 17:32:01 1996 PST | Fri Mar 01 17:32:01 1996 PST | @ 304 days - | Mon Dec 30 17:32:01 1996 PST | Mon Dec 30 17:32:01 1996 PST | @ 0 - | Mon Dec 30 17:32:01 1996 PST | Tue Dec 31 17:32:01 1996 PST | @ 1 day ago - | Mon Dec 30 17:32:01 1996 PST | Fri Dec 31 17:32:01 1999 PST | @ 1096 days ago - | Mon Dec 30 17:32:01 1996 PST | Sat Jan 01 17:32:01 2000 PST | @ 1097 days ago - | Mon Dec 30 17:32:01 1996 PST | Wed Mar 15 02:14:05 2000 PST | @ 1170 days 8 hours 42 mins 4 secs ago - | Mon Dec 30 17:32:01 1996 PST | Wed Mar 15 03:14:04 2000 PST | @ 1170 days 9 hours 42 mins 3 secs ago - | Mon Dec 30 17:32:01 1996 PST | Wed Mar 15 08:14:01 2000 PST | @ 1170 days 14 hours 42 mins ago - | Mon Dec 30 17:32:01 1996 PST | Wed Mar 15 12:14:03 2000 PST | @ 1170 days 18 hours 42 mins 2 secs ago - | Mon Dec 30 17:32:01 1996 PST | Wed Mar 15 13:14:02 2000 PST | @ 1170 days 19 hours 42 mins 1 sec ago - | Mon Dec 30 17:32:01 1996 PST | Sun Dec 31 17:32:01 2000 PST | @ 1462 days ago - | Mon Dec 30 17:32:01 1996 PST | Mon Jan 01 17:32:01 2001 PST | @ 1463 days ago - | Mon Dec 30 17:32:01 1996 PST | Sat Sep 22 18:19:20 2001 PDT | @ 1726 days 23 hours 47 mins 19 secs ago - | Tue Dec 31 17:32:01 1996 PST | Thu Jan 01 00:00:00 1970 PST | @ 9861 days 17 hours 32 mins 1 sec - | Tue Dec 31 17:32:01 1996 PST | Wed Feb 28 17:32:01 1996 PST | @ 307 days - | Tue Dec 31 17:32:01 1996 PST | Thu Feb 29 17:32:01 1996 PST | @ 306 days - | Tue Dec 31 17:32:01 1996 PST | Fri Mar 01 17:32:01 1996 PST | @ 305 days - | Tue Dec 31 17:32:01 1996 PST | Mon Dec 30 17:32:01 1996 PST | @ 1 day - | Tue Dec 31 17:32:01 1996 PST | Tue Dec 31 17:32:01 1996 PST | @ 0 - | Tue Dec 31 17:32:01 1996 PST | Fri Dec 31 17:32:01 1999 PST | @ 1095 days ago - | Tue Dec 31 17:32:01 1996 PST | Sat Jan 01 17:32:01 2000 PST | @ 1096 days ago - | Tue Dec 31 17:32:01 1996 PST | Wed Mar 15 02:14:05 2000 PST | @ 1169 days 8 hours 42 mins 4 secs ago - | Tue Dec 31 17:32:01 1996 PST | Wed Mar 15 03:14:04 2000 PST | @ 1169 days 9 hours 42 mins 3 secs ago - | Tue Dec 31 17:32:01 1996 PST | Wed Mar 15 08:14:01 2000 PST | @ 1169 days 14 hours 42 mins ago - | Tue Dec 31 17:32:01 1996 PST | Wed Mar 15 12:14:03 2000 PST | @ 1169 days 18 hours 42 mins 2 secs ago - | Tue Dec 31 17:32:01 1996 PST | Wed Mar 15 13:14:02 2000 PST | @ 1169 days 19 hours 42 mins 1 sec ago - | Tue Dec 31 17:32:01 1996 PST | Sun Dec 31 17:32:01 2000 PST | @ 1461 days ago - | Tue Dec 31 17:32:01 1996 PST | Mon Jan 01 17:32:01 2001 PST | @ 1462 days ago - | Tue Dec 31 17:32:01 1996 PST | Sat Sep 22 18:19:20 2001 PDT | @ 1725 days 23 hours 47 mins 19 secs ago - | Fri Dec 31 17:32:01 1999 PST | Thu Jan 01 00:00:00 1970 PST | @ 10956 days 17 hours 32 mins 1 sec - | Fri Dec 31 17:32:01 1999 PST | Wed Feb 28 17:32:01 1996 PST | @ 1402 days - | Fri Dec 31 17:32:01 1999 PST | Thu Feb 29 17:32:01 1996 PST | @ 1401 days - | Fri Dec 31 17:32:01 1999 PST | Fri Mar 01 17:32:01 1996 PST | @ 1400 days - | Fri Dec 31 17:32:01 1999 PST | Mon Dec 30 17:32:01 1996 PST | @ 1096 days - | Fri Dec 31 17:32:01 1999 PST | Tue Dec 31 17:32:01 1996 PST | @ 1095 days - | Fri Dec 31 17:32:01 1999 PST | Fri Dec 31 17:32:01 1999 PST | @ 0 - | Fri Dec 31 17:32:01 1999 PST | Sat Jan 01 17:32:01 2000 PST | @ 1 day ago - | Fri Dec 31 17:32:01 1999 PST | Wed Mar 15 02:14:05 2000 PST | @ 74 days 8 hours 42 mins 4 secs ago - | Fri Dec 31 17:32:01 1999 PST | Wed Mar 15 03:14:04 2000 PST | @ 74 days 9 hours 42 mins 3 secs ago - | Fri Dec 31 17:32:01 1999 PST | Wed Mar 15 08:14:01 2000 PST | @ 74 days 14 hours 42 mins ago - | Fri Dec 31 17:32:01 1999 PST | Wed Mar 15 12:14:03 2000 PST | @ 74 days 18 hours 42 mins 2 secs ago - | Fri Dec 31 17:32:01 1999 PST | Wed Mar 15 13:14:02 2000 PST | @ 74 days 19 hours 42 mins 1 sec ago - | Fri Dec 31 17:32:01 1999 PST | Sun Dec 31 17:32:01 2000 PST | @ 366 days ago - | Fri Dec 31 17:32:01 1999 PST | Mon Jan 01 17:32:01 2001 PST | @ 367 days ago - | Fri Dec 31 17:32:01 1999 PST | Sat Sep 22 18:19:20 2001 PDT | @ 630 days 23 hours 47 mins 19 secs ago - | Sat Jan 01 17:32:01 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 10957 days 17 hours 32 mins 1 sec - | Sat Jan 01 17:32:01 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1403 days - | Sat Jan 01 17:32:01 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1402 days - | Sat Jan 01 17:32:01 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1401 days - | Sat Jan 01 17:32:01 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1097 days - | Sat Jan 01 17:32:01 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1096 days - | Sat Jan 01 17:32:01 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 1 day - | Sat Jan 01 17:32:01 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 0 - | Sat Jan 01 17:32:01 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 73 days 8 hours 42 mins 4 secs ago - | Sat Jan 01 17:32:01 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 73 days 9 hours 42 mins 3 secs ago - | Sat Jan 01 17:32:01 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 73 days 14 hours 42 mins ago - | Sat Jan 01 17:32:01 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 73 days 18 hours 42 mins 2 secs ago - | Sat Jan 01 17:32:01 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 73 days 19 hours 42 mins 1 sec ago - | Sat Jan 01 17:32:01 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 365 days ago - | Sat Jan 01 17:32:01 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 366 days ago - | Sat Jan 01 17:32:01 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 629 days 23 hours 47 mins 19 secs ago - | Wed Mar 15 02:14:05 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 11031 days 2 hours 14 mins 5 secs - | Wed Mar 15 02:14:05 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1476 days 8 hours 42 mins 4 secs - | Wed Mar 15 02:14:05 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1475 days 8 hours 42 mins 4 secs - | Wed Mar 15 02:14:05 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1474 days 8 hours 42 mins 4 secs - | Wed Mar 15 02:14:05 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1170 days 8 hours 42 mins 4 secs - | Wed Mar 15 02:14:05 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1169 days 8 hours 42 mins 4 secs - | Wed Mar 15 02:14:05 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 74 days 8 hours 42 mins 4 secs - | Wed Mar 15 02:14:05 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 73 days 8 hours 42 mins 4 secs - | Wed Mar 15 02:14:05 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 0 - | Wed Mar 15 02:14:05 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 59 mins 59 secs ago - | Wed Mar 15 02:14:05 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 5 hours 59 mins 56 secs ago - | Wed Mar 15 02:14:05 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 9 hours 59 mins 58 secs ago - | Wed Mar 15 02:14:05 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 10 hours 59 mins 57 secs ago - | Wed Mar 15 02:14:05 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 291 days 15 hours 17 mins 56 secs ago - | Wed Mar 15 02:14:05 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 292 days 15 hours 17 mins 56 secs ago - | Wed Mar 15 02:14:05 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 556 days 15 hours 5 mins 15 secs ago - | Wed Mar 15 03:14:04 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 11031 days 3 hours 14 mins 4 secs - | Wed Mar 15 03:14:04 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1476 days 9 hours 42 mins 3 secs - | Wed Mar 15 03:14:04 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1475 days 9 hours 42 mins 3 secs - | Wed Mar 15 03:14:04 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1474 days 9 hours 42 mins 3 secs - | Wed Mar 15 03:14:04 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1170 days 9 hours 42 mins 3 secs - | Wed Mar 15 03:14:04 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1169 days 9 hours 42 mins 3 secs - | Wed Mar 15 03:14:04 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 74 days 9 hours 42 mins 3 secs - | Wed Mar 15 03:14:04 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 73 days 9 hours 42 mins 3 secs - | Wed Mar 15 03:14:04 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 59 mins 59 secs - | Wed Mar 15 03:14:04 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 0 - | Wed Mar 15 03:14:04 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 4 hours 59 mins 57 secs ago - | Wed Mar 15 03:14:04 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 8 hours 59 mins 59 secs ago - | Wed Mar 15 03:14:04 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 9 hours 59 mins 58 secs ago - | Wed Mar 15 03:14:04 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 291 days 14 hours 17 mins 57 secs ago - | Wed Mar 15 03:14:04 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 292 days 14 hours 17 mins 57 secs ago - | Wed Mar 15 03:14:04 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 556 days 14 hours 5 mins 16 secs ago - | Wed Mar 15 08:14:01 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 11031 days 8 hours 14 mins 1 sec - | Wed Mar 15 08:14:01 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1476 days 14 hours 42 mins - | Wed Mar 15 08:14:01 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1475 days 14 hours 42 mins - | Wed Mar 15 08:14:01 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1474 days 14 hours 42 mins - | Wed Mar 15 08:14:01 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1170 days 14 hours 42 mins - | Wed Mar 15 08:14:01 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1169 days 14 hours 42 mins - | Wed Mar 15 08:14:01 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 74 days 14 hours 42 mins - | Wed Mar 15 08:14:01 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 73 days 14 hours 42 mins - | Wed Mar 15 08:14:01 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 5 hours 59 mins 56 secs - | Wed Mar 15 08:14:01 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 4 hours 59 mins 57 secs - | Wed Mar 15 08:14:01 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 0 - | Wed Mar 15 08:14:01 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 4 hours 2 secs ago - | Wed Mar 15 08:14:01 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 5 hours 1 sec ago - | Wed Mar 15 08:14:01 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 291 days 9 hours 18 mins ago - | Wed Mar 15 08:14:01 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 292 days 9 hours 18 mins ago - | Wed Mar 15 08:14:01 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 556 days 9 hours 5 mins 19 secs ago - | Wed Mar 15 12:14:03 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 11031 days 12 hours 14 mins 3 secs - | Wed Mar 15 12:14:03 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1476 days 18 hours 42 mins 2 secs - | Wed Mar 15 12:14:03 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1475 days 18 hours 42 mins 2 secs - | Wed Mar 15 12:14:03 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1474 days 18 hours 42 mins 2 secs - | Wed Mar 15 12:14:03 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1170 days 18 hours 42 mins 2 secs - | Wed Mar 15 12:14:03 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1169 days 18 hours 42 mins 2 secs - | Wed Mar 15 12:14:03 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 74 days 18 hours 42 mins 2 secs - | Wed Mar 15 12:14:03 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 73 days 18 hours 42 mins 2 secs - | Wed Mar 15 12:14:03 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 9 hours 59 mins 58 secs - | Wed Mar 15 12:14:03 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 8 hours 59 mins 59 secs - | Wed Mar 15 12:14:03 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 4 hours 2 secs - | Wed Mar 15 12:14:03 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 0 - | Wed Mar 15 12:14:03 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 59 mins 59 secs ago - | Wed Mar 15 12:14:03 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 291 days 5 hours 17 mins 58 secs ago - | Wed Mar 15 12:14:03 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 292 days 5 hours 17 mins 58 secs ago - | Wed Mar 15 12:14:03 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 556 days 5 hours 5 mins 17 secs ago - | Wed Mar 15 13:14:02 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 11031 days 13 hours 14 mins 2 secs - | Wed Mar 15 13:14:02 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1476 days 19 hours 42 mins 1 sec - | Wed Mar 15 13:14:02 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1475 days 19 hours 42 mins 1 sec - | Wed Mar 15 13:14:02 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1474 days 19 hours 42 mins 1 sec - | Wed Mar 15 13:14:02 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1170 days 19 hours 42 mins 1 sec - | Wed Mar 15 13:14:02 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1169 days 19 hours 42 mins 1 sec - | Wed Mar 15 13:14:02 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 74 days 19 hours 42 mins 1 sec - | Wed Mar 15 13:14:02 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 73 days 19 hours 42 mins 1 sec - | Wed Mar 15 13:14:02 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 10 hours 59 mins 57 secs - | Wed Mar 15 13:14:02 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 9 hours 59 mins 58 secs - | Wed Mar 15 13:14:02 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 5 hours 1 sec - | Wed Mar 15 13:14:02 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 59 mins 59 secs - | Wed Mar 15 13:14:02 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 0 - | Wed Mar 15 13:14:02 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 291 days 4 hours 17 mins 59 secs ago - | Wed Mar 15 13:14:02 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 292 days 4 hours 17 mins 59 secs ago - | Wed Mar 15 13:14:02 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 556 days 4 hours 5 mins 18 secs ago - | Sun Dec 31 17:32:01 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 11322 days 17 hours 32 mins 1 sec - | Sun Dec 31 17:32:01 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1768 days - | Sun Dec 31 17:32:01 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1767 days - | Sun Dec 31 17:32:01 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1766 days - | Sun Dec 31 17:32:01 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1462 days - | Sun Dec 31 17:32:01 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1461 days - | Sun Dec 31 17:32:01 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 366 days - | Sun Dec 31 17:32:01 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 365 days - | Sun Dec 31 17:32:01 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 291 days 15 hours 17 mins 56 secs - | Sun Dec 31 17:32:01 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 291 days 14 hours 17 mins 57 secs - | Sun Dec 31 17:32:01 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 291 days 9 hours 18 mins - | Sun Dec 31 17:32:01 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 291 days 5 hours 17 mins 58 secs - | Sun Dec 31 17:32:01 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 291 days 4 hours 17 mins 59 secs - | Sun Dec 31 17:32:01 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 0 - | Sun Dec 31 17:32:01 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 1 day ago - | Sun Dec 31 17:32:01 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 264 days 23 hours 47 mins 19 secs ago - | Mon Jan 01 17:32:01 2001 PST | Thu Jan 01 00:00:00 1970 PST | @ 11323 days 17 hours 32 mins 1 sec - | Mon Jan 01 17:32:01 2001 PST | Wed Feb 28 17:32:01 1996 PST | @ 1769 days - | Mon Jan 01 17:32:01 2001 PST | Thu Feb 29 17:32:01 1996 PST | @ 1768 days - | Mon Jan 01 17:32:01 2001 PST | Fri Mar 01 17:32:01 1996 PST | @ 1767 days - | Mon Jan 01 17:32:01 2001 PST | Mon Dec 30 17:32:01 1996 PST | @ 1463 days - | Mon Jan 01 17:32:01 2001 PST | Tue Dec 31 17:32:01 1996 PST | @ 1462 days - | Mon Jan 01 17:32:01 2001 PST | Fri Dec 31 17:32:01 1999 PST | @ 367 days - | Mon Jan 01 17:32:01 2001 PST | Sat Jan 01 17:32:01 2000 PST | @ 366 days - | Mon Jan 01 17:32:01 2001 PST | Wed Mar 15 02:14:05 2000 PST | @ 292 days 15 hours 17 mins 56 secs - | Mon Jan 01 17:32:01 2001 PST | Wed Mar 15 03:14:04 2000 PST | @ 292 days 14 hours 17 mins 57 secs - | Mon Jan 01 17:32:01 2001 PST | Wed Mar 15 08:14:01 2000 PST | @ 292 days 9 hours 18 mins - | Mon Jan 01 17:32:01 2001 PST | Wed Mar 15 12:14:03 2000 PST | @ 292 days 5 hours 17 mins 58 secs - | Mon Jan 01 17:32:01 2001 PST | Wed Mar 15 13:14:02 2000 PST | @ 292 days 4 hours 17 mins 59 secs - | Mon Jan 01 17:32:01 2001 PST | Sun Dec 31 17:32:01 2000 PST | @ 1 day - | Mon Jan 01 17:32:01 2001 PST | Mon Jan 01 17:32:01 2001 PST | @ 0 - | Mon Jan 01 17:32:01 2001 PST | Sat Sep 22 18:19:20 2001 PDT | @ 263 days 23 hours 47 mins 19 secs ago - | Sat Sep 22 18:19:20 2001 PDT | Thu Jan 01 00:00:00 1970 PST | @ 11587 days 17 hours 19 mins 20 secs - | Sat Sep 22 18:19:20 2001 PDT | Wed Feb 28 17:32:01 1996 PST | @ 2032 days 23 hours 47 mins 19 secs - | Sat Sep 22 18:19:20 2001 PDT | Thu Feb 29 17:32:01 1996 PST | @ 2031 days 23 hours 47 mins 19 secs - | Sat Sep 22 18:19:20 2001 PDT | Fri Mar 01 17:32:01 1996 PST | @ 2030 days 23 hours 47 mins 19 secs - | Sat Sep 22 18:19:20 2001 PDT | Mon Dec 30 17:32:01 1996 PST | @ 1726 days 23 hours 47 mins 19 secs - | Sat Sep 22 18:19:20 2001 PDT | Tue Dec 31 17:32:01 1996 PST | @ 1725 days 23 hours 47 mins 19 secs - | Sat Sep 22 18:19:20 2001 PDT | Fri Dec 31 17:32:01 1999 PST | @ 630 days 23 hours 47 mins 19 secs - | Sat Sep 22 18:19:20 2001 PDT | Sat Jan 01 17:32:01 2000 PST | @ 629 days 23 hours 47 mins 19 secs - | Sat Sep 22 18:19:20 2001 PDT | Wed Mar 15 02:14:05 2000 PST | @ 556 days 15 hours 5 mins 15 secs - | Sat Sep 22 18:19:20 2001 PDT | Wed Mar 15 03:14:04 2000 PST | @ 556 days 14 hours 5 mins 16 secs - | Sat Sep 22 18:19:20 2001 PDT | Wed Mar 15 08:14:01 2000 PST | @ 556 days 9 hours 5 mins 19 secs - | Sat Sep 22 18:19:20 2001 PDT | Wed Mar 15 12:14:03 2000 PST | @ 556 days 5 hours 5 mins 17 secs - | Sat Sep 22 18:19:20 2001 PDT | Wed Mar 15 13:14:02 2000 PST | @ 556 days 4 hours 5 mins 18 secs - | Sat Sep 22 18:19:20 2001 PDT | Sun Dec 31 17:32:01 2000 PST | @ 264 days 23 hours 47 mins 19 secs - | Sat Sep 22 18:19:20 2001 PDT | Mon Jan 01 17:32:01 2001 PST | @ 263 days 23 hours 47 mins 19 secs - | Sat Sep 22 18:19:20 2001 PDT | Sat Sep 22 18:19:20 2001 PDT | @ 0 -(256 rows) - --- --- abstime, reltime arithmetic --- -SELECT '' AS ten, ABSTIME_TBL.f1 AS abstime, RELTIME_TBL.f1 AS reltime - WHERE (ABSTIME_TBL.f1 + RELTIME_TBL.f1) < abstime 'Jan 14 14:00:00 1971' - ORDER BY abstime, reltime; - ten | abstime | reltime ------+------------------------------+--------------- - | Sat May 10 23:59:12 1947 PST | @ 14 secs ago - | Sat May 10 23:59:12 1947 PST | @ 1 min - | Sat May 10 23:59:12 1947 PST | @ 5 hours - | Sat May 10 23:59:12 1947 PST | @ 10 days - | Sat May 10 23:59:12 1947 PST | @ 3 mons - | Wed Dec 31 16:00:00 1969 PST | @ 14 secs ago - | Wed Dec 31 16:00:00 1969 PST | @ 1 min - | Wed Dec 31 16:00:00 1969 PST | @ 5 hours - | Wed Dec 31 16:00:00 1969 PST | @ 10 days - | Wed Dec 31 16:00:00 1969 PST | @ 3 mons -(10 rows) - --- these four queries should return the same answer --- the "infinity" and "-infinity" tuples in ABSTIME_TBL cannot be added and --- therefore, should not show up in the results. -SELECT '' AS three, ABSTIME_TBL.* - WHERE (ABSTIME_TBL.f1 + reltime '@ 3 year') -- +3 years - < abstime 'Jan 14 14:00:00 1977'; - three | f1 --------+------------------------------ - | Sun Jan 14 03:14:21 1973 PST - | Wed Dec 31 16:00:00 1969 PST - | Sat May 10 23:59:12 1947 PST -(3 rows) - -SELECT '' AS three, ABSTIME_TBL.* - WHERE (ABSTIME_TBL.f1 + reltime '@ 3 year ago') -- -3 years - < abstime 'Jan 14 14:00:00 1971'; - three | f1 --------+------------------------------ - | Sun Jan 14 03:14:21 1973 PST - | Wed Dec 31 16:00:00 1969 PST - | Sat May 10 23:59:12 1947 PST -(3 rows) - -SELECT '' AS three, ABSTIME_TBL.* - WHERE (ABSTIME_TBL.f1 - reltime '@ 3 year') -- -(+3) years - < abstime 'Jan 14 14:00:00 1971'; - three | f1 --------+------------------------------ - | Sun Jan 14 03:14:21 1973 PST - | Wed Dec 31 16:00:00 1969 PST - | Sat May 10 23:59:12 1947 PST -(3 rows) - -SELECT '' AS three, ABSTIME_TBL.* - WHERE (ABSTIME_TBL.f1 - reltime '@ 3 year ago') -- -(-3) years - < abstime 'Jan 14 14:00:00 1977'; - three | f1 --------+------------------------------ - | Sun Jan 14 03:14:21 1973 PST - | Wed Dec 31 16:00:00 1969 PST - | Sat May 10 23:59:12 1947 PST -(3 rows) - --- --- Conversions --- -SELECT '' AS "16", f1 AS "timestamp", date(f1) AS date - FROM TEMP_TIMESTAMP - WHERE f1 <> timestamp 'now' - ORDER BY date, "timestamp"; - 16 | timestamp | date -----+------------------------------+------------ - | Thu Jan 01 00:00:00 1970 PST | 01-01-1970 - | Wed Feb 28 17:32:01 1996 PST | 02-28-1996 - | Thu Feb 29 17:32:01 1996 PST | 02-29-1996 - | Fri Mar 01 17:32:01 1996 PST | 03-01-1996 - | Mon Dec 30 17:32:01 1996 PST | 12-30-1996 - | Tue Dec 31 17:32:01 1996 PST | 12-31-1996 - | Fri Dec 31 17:32:01 1999 PST | 12-31-1999 - | Sat Jan 01 17:32:01 2000 PST | 01-01-2000 - | Wed Mar 15 02:14:05 2000 PST | 03-15-2000 - | Wed Mar 15 03:14:04 2000 PST | 03-15-2000 - | Wed Mar 15 08:14:01 2000 PST | 03-15-2000 - | Wed Mar 15 12:14:03 2000 PST | 03-15-2000 - | Wed Mar 15 13:14:02 2000 PST | 03-15-2000 - | Sun Dec 31 17:32:01 2000 PST | 12-31-2000 - | Mon Jan 01 17:32:01 2001 PST | 01-01-2001 - | Sat Sep 22 18:19:20 2001 PDT | 09-22-2001 -(16 rows) - -SELECT '' AS "16", f1 AS "timestamp", abstime(f1) AS abstime - FROM TEMP_TIMESTAMP - ORDER BY abstime; - 16 | timestamp | abstime -----+------------------------------+------------------------------ - | Thu Jan 01 00:00:00 1970 PST | Thu Jan 01 00:00:00 1970 PST - | Wed Feb 28 17:32:01 1996 PST | Wed Feb 28 17:32:01 1996 PST - | Thu Feb 29 17:32:01 1996 PST | Thu Feb 29 17:32:01 1996 PST - | Fri Mar 01 17:32:01 1996 PST | Fri Mar 01 17:32:01 1996 PST - | Mon Dec 30 17:32:01 1996 PST | Mon Dec 30 17:32:01 1996 PST - | Tue Dec 31 17:32:01 1996 PST | Tue Dec 31 17:32:01 1996 PST - | Fri Dec 31 17:32:01 1999 PST | Fri Dec 31 17:32:01 1999 PST - | Sat Jan 01 17:32:01 2000 PST | Sat Jan 01 17:32:01 2000 PST - | Wed Mar 15 02:14:05 2000 PST | Wed Mar 15 02:14:05 2000 PST - | Wed Mar 15 03:14:04 2000 PST | Wed Mar 15 03:14:04 2000 PST - | Wed Mar 15 08:14:01 2000 PST | Wed Mar 15 08:14:01 2000 PST - | Wed Mar 15 12:14:03 2000 PST | Wed Mar 15 12:14:03 2000 PST - | Wed Mar 15 13:14:02 2000 PST | Wed Mar 15 13:14:02 2000 PST - | Sun Dec 31 17:32:01 2000 PST | Sun Dec 31 17:32:01 2000 PST - | Mon Jan 01 17:32:01 2001 PST | Mon Jan 01 17:32:01 2001 PST - | Sat Sep 22 18:19:20 2001 PDT | Sat Sep 22 18:19:20 2001 PDT -(16 rows) - -SELECT '' AS four, f1 AS abstime, date(f1) AS date - FROM ABSTIME_TBL - WHERE isfinite(f1) AND f1 <> abstime 'now' - ORDER BY date, abstime; - four | abstime | date -------+------------------------------+------------ - | Sat May 10 23:59:12 1947 PST | 05-10-1947 - | Wed Dec 31 16:00:00 1969 PST | 12-31-1969 - | Sun Jan 14 03:14:21 1973 PST | 01-14-1973 - | Mon May 01 00:30:30 1995 PDT | 05-01-1995 -(4 rows) - -SELECT '' AS two, d1 AS "timestamp", abstime(d1) AS abstime - FROM TIMESTAMP_TBL WHERE NOT isfinite(d1); - two | timestamp | abstime ------+-----------+----------- - | -infinity | -infinity - | infinity | infinity -(2 rows) - -SELECT '' AS three, f1 as abstime, cast(f1 as timestamp) AS "timestamp" - FROM ABSTIME_TBL WHERE NOT isfinite(f1); -ERROR: cannot convert abstime "invalid" to timestamp -SELECT '' AS ten, f1 AS interval, reltime(f1) AS reltime - FROM INTERVAL_TBL; - ten | interval | reltime ------+-------------------------------+------------------------------- - | @ 1 min | @ 1 min - | @ 5 hours | @ 5 hours - | @ 10 days | @ 10 days - | @ 34 years | @ 34 years - | @ 3 mons | @ 3 mons - | @ 14 secs ago | @ 14 secs ago - | @ 1 day 2 hours 3 mins 4 secs | @ 1 day 2 hours 3 mins 4 secs - | @ 6 years | @ 6 years - | @ 5 mons | @ 5 mons - | @ 5 mons 12 hours | @ 5 mons 12 hours -(10 rows) - -SELECT '' AS six, f1 as reltime, CAST(f1 AS interval) AS interval - FROM RELTIME_TBL; - six | reltime | interval ------+---------------+--------------- - | @ 1 min | @ 1 min - | @ 5 hours | @ 5 hours - | @ 10 days | @ 10 days - | @ 34 years | @ 34 years - | @ 3 mons | @ 3 mons - | @ 14 secs ago | @ 14 secs ago -(6 rows) - -DROP TABLE TEMP_TIMESTAMP; --- --- Formats --- -SET DateStyle TO 'US,Postgres'; -SHOW DateStyle; - DateStyle ---------------- - Postgres, MDY -(1 row) - -SELECT '' AS "64", d1 AS us_postgres FROM TIMESTAMP_TBL; - 64 | us_postgres -----+----------------------------- - | -infinity - | infinity - | Thu Jan 01 00:00:00 1970 - | 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 - | Thu Jan 02 00:00:00 1997 - | Thu Jan 02 03:04:05 1997 - | Mon Feb 10 17:32:01 1997 - | Mon Feb 10 17:32:01 1997 - | Mon Feb 10 17:32:01 1997 - | Mon Feb 10 17:32:01 1997 - | Tue Jun 10 17:32:01 1997 - | Sat Sep 22 18:19:20 2001 - | Wed Mar 15 08:14:01 2000 - | Wed Mar 15 13:14:02 2000 - | Wed Mar 15 12:14:03 2000 - | Wed Mar 15 03:14:04 2000 - | Wed Mar 15 02:14:05 2000 - | Mon Feb 10 17:32:01 1997 - | Mon Feb 10 17:32:01 1997 - | Mon Feb 10 17:32:00 1997 - | Mon Feb 10 17:32:01 1997 - | Mon Feb 10 17:32:01 1997 - | Mon Feb 10 17:32:01 1997 - | Mon Feb 10 17:32:01 1997 - | Mon Feb 10 17:32:01 1997 - | Mon Feb 10 17:32:01 1997 - | Mon Feb 10 17:32:01 1997 - | Mon Feb 10 17:32:01 1997 - | Tue Jun 10 18:32:01 1997 - | Mon Feb 10 17:32:01 1997 - | Tue Feb 11 17:32:01 1997 - | Wed Feb 12 17:32:01 1997 - | Thu Feb 13 17:32:01 1997 - | Fri Feb 14 17:32:01 1997 - | Sat Feb 15 17:32:01 1997 - | Sun Feb 16 17:32:01 1997 - | Tue Feb 16 17:32:01 0097 BC - | Sat Feb 16 17:32:01 0097 - | Thu Feb 16 17:32:01 0597 - | Tue Feb 16 17:32:01 1097 - | Sat Feb 16 17:32:01 1697 - | Thu Feb 16 17:32:01 1797 - | Tue Feb 16 17:32:01 1897 - | Sun Feb 16 17:32:01 1997 - | Sat Feb 16 17:32:01 2097 - | Wed Feb 28 17:32:01 1996 - | Thu Feb 29 17:32:01 1996 - | Fri Mar 01 17:32:01 1996 - | Mon Dec 30 17:32:01 1996 - | Tue Dec 31 17:32:01 1996 - | Wed Jan 01 17:32:01 1997 - | Fri Feb 28 17:32:01 1997 - | Sat Mar 01 17:32:01 1997 - | Tue Dec 30 17:32:01 1997 - | Wed Dec 31 17:32:01 1997 - | Fri Dec 31 17:32:01 1999 - | Sat Jan 01 17:32:01 2000 - | Sun Dec 31 17:32:01 2000 - | Mon Jan 01 17:32:01 2001 -(64 rows) - -SELECT '' AS seven, f1 AS us_postgres FROM ABSTIME_TBL; - seven | us_postgres --------+------------------------------ - | Sun Jan 14 03:14:21 1973 PST - | Mon May 01 00:30:30 1995 PDT - | Wed Dec 31 16:00:00 1969 PST - | infinity - | -infinity - | Sat May 10 23:59:12 1947 PST - | invalid -(7 rows) - -SET DateStyle TO 'US,ISO'; -SELECT '' AS "64", d1 AS us_iso FROM TIMESTAMP_TBL; - 64 | us_iso -----+------------------------ - | -infinity - | infinity - | 1970-01-01 00:00:00 - | 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-01-02 00:00:00 - | 1997-01-02 03:04:05 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-06-10 17:32:01 - | 2001-09-22 18:19:20 - | 2000-03-15 08:14:01 - | 2000-03-15 13:14:02 - | 2000-03-15 12:14:03 - | 2000-03-15 03:14:04 - | 2000-03-15 02:14:05 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:00 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-06-10 18:32:01 - | 1997-02-10 17:32:01 - | 1997-02-11 17:32:01 - | 1997-02-12 17:32:01 - | 1997-02-13 17:32:01 - | 1997-02-14 17:32:01 - | 1997-02-15 17:32:01 - | 1997-02-16 17:32:01 - | 0097-02-16 17:32:01 BC - | 0097-02-16 17:32:01 - | 0597-02-16 17:32:01 - | 1097-02-16 17:32:01 - | 1697-02-16 17:32:01 - | 1797-02-16 17:32:01 - | 1897-02-16 17:32:01 - | 1997-02-16 17:32:01 - | 2097-02-16 17:32:01 - | 1996-02-28 17:32:01 - | 1996-02-29 17:32:01 - | 1996-03-01 17:32:01 - | 1996-12-30 17:32:01 - | 1996-12-31 17:32:01 - | 1997-01-01 17:32:01 - | 1997-02-28 17:32:01 - | 1997-03-01 17:32:01 - | 1997-12-30 17:32:01 - | 1997-12-31 17:32:01 - | 1999-12-31 17:32:01 - | 2000-01-01 17:32:01 - | 2000-12-31 17:32:01 - | 2001-01-01 17:32:01 -(64 rows) - -SELECT '' AS seven, f1 AS us_iso FROM ABSTIME_TBL; - seven | us_iso --------+------------------------ - | 1973-01-14 03:14:21-08 - | 1995-05-01 00:30:30-07 - | 1969-12-31 16:00:00-08 - | infinity - | -infinity - | 1947-05-10 23:59:12-08 - | invalid -(7 rows) - -SET DateStyle TO 'US,SQL'; -SHOW DateStyle; - DateStyle ------------ - SQL, MDY -(1 row) - -SELECT '' AS "64", d1 AS us_sql FROM TIMESTAMP_TBL; - 64 | us_sql -----+------------------------ - | -infinity - | infinity - | 01/01/1970 00:00:00 - | 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 - | 01/02/1997 00:00:00 - | 01/02/1997 03:04:05 - | 02/10/1997 17:32:01 - | 02/10/1997 17:32:01 - | 02/10/1997 17:32:01 - | 02/10/1997 17:32:01 - | 06/10/1997 17:32:01 - | 09/22/2001 18:19:20 - | 03/15/2000 08:14:01 - | 03/15/2000 13:14:02 - | 03/15/2000 12:14:03 - | 03/15/2000 03:14:04 - | 03/15/2000 02:14:05 - | 02/10/1997 17:32:01 - | 02/10/1997 17:32:01 - | 02/10/1997 17:32:00 - | 02/10/1997 17:32:01 - | 02/10/1997 17:32:01 - | 02/10/1997 17:32:01 - | 02/10/1997 17:32:01 - | 02/10/1997 17:32:01 - | 02/10/1997 17:32:01 - | 02/10/1997 17:32:01 - | 02/10/1997 17:32:01 - | 06/10/1997 18:32:01 - | 02/10/1997 17:32:01 - | 02/11/1997 17:32:01 - | 02/12/1997 17:32:01 - | 02/13/1997 17:32:01 - | 02/14/1997 17:32:01 - | 02/15/1997 17:32:01 - | 02/16/1997 17:32:01 - | 02/16/0097 17:32:01 BC - | 02/16/0097 17:32:01 - | 02/16/0597 17:32:01 - | 02/16/1097 17:32:01 - | 02/16/1697 17:32:01 - | 02/16/1797 17:32:01 - | 02/16/1897 17:32:01 - | 02/16/1997 17:32:01 - | 02/16/2097 17:32:01 - | 02/28/1996 17:32:01 - | 02/29/1996 17:32:01 - | 03/01/1996 17:32:01 - | 12/30/1996 17:32:01 - | 12/31/1996 17:32:01 - | 01/01/1997 17:32:01 - | 02/28/1997 17:32:01 - | 03/01/1997 17:32:01 - | 12/30/1997 17:32:01 - | 12/31/1997 17:32:01 - | 12/31/1999 17:32:01 - | 01/01/2000 17:32:01 - | 12/31/2000 17:32:01 - | 01/01/2001 17:32:01 -(64 rows) - -SELECT '' AS seven, f1 AS us_sql FROM ABSTIME_TBL; - seven | us_sql --------+------------------------- - | 01/14/1973 03:14:21 PST - | 05/01/1995 00:30:30 PDT - | 12/31/1969 16:00:00 PST - | infinity - | -infinity - | 05/10/1947 23:59:12 PST - | invalid -(7 rows) - -SET DateStyle TO 'European,Postgres'; -SHOW DateStyle; - DateStyle ---------------- - Postgres, DMY -(1 row) - -INSERT INTO TIMESTAMP_TBL VALUES('13/06/1957'); -SELECT count(*) as one FROM TIMESTAMP_TBL WHERE d1 = 'Jun 13 1957'; - one ------ - 1 -(1 row) - -SELECT '' AS "65", d1 AS european_postgres FROM TIMESTAMP_TBL; - 65 | european_postgres -----+----------------------------- - | -infinity - | infinity - | Thu 01 Jan 00:00:00 1970 - | 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 - | Thu 02 Jan 00:00:00 1997 - | Thu 02 Jan 03:04:05 1997 - | Mon 10 Feb 17:32:01 1997 - | Mon 10 Feb 17:32:01 1997 - | Mon 10 Feb 17:32:01 1997 - | Mon 10 Feb 17:32:01 1997 - | Tue 10 Jun 17:32:01 1997 - | Sat 22 Sep 18:19:20 2001 - | Wed 15 Mar 08:14:01 2000 - | Wed 15 Mar 13:14:02 2000 - | Wed 15 Mar 12:14:03 2000 - | Wed 15 Mar 03:14:04 2000 - | Wed 15 Mar 02:14:05 2000 - | Mon 10 Feb 17:32:01 1997 - | Mon 10 Feb 17:32:01 1997 - | Mon 10 Feb 17:32:00 1997 - | Mon 10 Feb 17:32:01 1997 - | Mon 10 Feb 17:32:01 1997 - | Mon 10 Feb 17:32:01 1997 - | Mon 10 Feb 17:32:01 1997 - | Mon 10 Feb 17:32:01 1997 - | Mon 10 Feb 17:32:01 1997 - | Mon 10 Feb 17:32:01 1997 - | Mon 10 Feb 17:32:01 1997 - | Tue 10 Jun 18:32:01 1997 - | Mon 10 Feb 17:32:01 1997 - | Tue 11 Feb 17:32:01 1997 - | Wed 12 Feb 17:32:01 1997 - | Thu 13 Feb 17:32:01 1997 - | Fri 14 Feb 17:32:01 1997 - | Sat 15 Feb 17:32:01 1997 - | Sun 16 Feb 17:32:01 1997 - | Tue 16 Feb 17:32:01 0097 BC - | Sat 16 Feb 17:32:01 0097 - | Thu 16 Feb 17:32:01 0597 - | Tue 16 Feb 17:32:01 1097 - | Sat 16 Feb 17:32:01 1697 - | Thu 16 Feb 17:32:01 1797 - | Tue 16 Feb 17:32:01 1897 - | Sun 16 Feb 17:32:01 1997 - | Sat 16 Feb 17:32:01 2097 - | Wed 28 Feb 17:32:01 1996 - | Thu 29 Feb 17:32:01 1996 - | Fri 01 Mar 17:32:01 1996 - | Mon 30 Dec 17:32:01 1996 - | Tue 31 Dec 17:32:01 1996 - | Wed 01 Jan 17:32:01 1997 - | Fri 28 Feb 17:32:01 1997 - | Sat 01 Mar 17:32:01 1997 - | Tue 30 Dec 17:32:01 1997 - | Wed 31 Dec 17:32:01 1997 - | Fri 31 Dec 17:32:01 1999 - | Sat 01 Jan 17:32:01 2000 - | Sun 31 Dec 17:32:01 2000 - | Mon 01 Jan 17:32:01 2001 - | Thu 13 Jun 00:00:00 1957 -(65 rows) - -SELECT '' AS seven, f1 AS european_postgres FROM ABSTIME_TBL; - seven | european_postgres --------+------------------------------ - | Sun 14 Jan 03:14:21 1973 PST - | Mon 01 May 00:30:30 1995 PDT - | Wed 31 Dec 16:00:00 1969 PST - | infinity - | -infinity - | Sat 10 May 23:59:12 1947 PST - | invalid -(7 rows) - -SET DateStyle TO 'European,ISO'; -SHOW DateStyle; - DateStyle ------------ - ISO, DMY -(1 row) - -SELECT '' AS "65", d1 AS european_iso FROM TIMESTAMP_TBL; - 65 | european_iso -----+------------------------ - | -infinity - | infinity - | 1970-01-01 00:00:00 - | 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-01-02 00:00:00 - | 1997-01-02 03:04:05 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-06-10 17:32:01 - | 2001-09-22 18:19:20 - | 2000-03-15 08:14:01 - | 2000-03-15 13:14:02 - | 2000-03-15 12:14:03 - | 2000-03-15 03:14:04 - | 2000-03-15 02:14:05 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:00 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-06-10 18:32:01 - | 1997-02-10 17:32:01 - | 1997-02-11 17:32:01 - | 1997-02-12 17:32:01 - | 1997-02-13 17:32:01 - | 1997-02-14 17:32:01 - | 1997-02-15 17:32:01 - | 1997-02-16 17:32:01 - | 0097-02-16 17:32:01 BC - | 0097-02-16 17:32:01 - | 0597-02-16 17:32:01 - | 1097-02-16 17:32:01 - | 1697-02-16 17:32:01 - | 1797-02-16 17:32:01 - | 1897-02-16 17:32:01 - | 1997-02-16 17:32:01 - | 2097-02-16 17:32:01 - | 1996-02-28 17:32:01 - | 1996-02-29 17:32:01 - | 1996-03-01 17:32:01 - | 1996-12-30 17:32:01 - | 1996-12-31 17:32:01 - | 1997-01-01 17:32:01 - | 1997-02-28 17:32:01 - | 1997-03-01 17:32:01 - | 1997-12-30 17:32:01 - | 1997-12-31 17:32:01 - | 1999-12-31 17:32:01 - | 2000-01-01 17:32:01 - | 2000-12-31 17:32:01 - | 2001-01-01 17:32:01 - | 1957-06-13 00:00:00 -(65 rows) - -SELECT '' AS seven, f1 AS european_iso FROM ABSTIME_TBL; - seven | european_iso --------+------------------------ - | 1973-01-14 03:14:21-08 - | 1995-05-01 00:30:30-07 - | 1969-12-31 16:00:00-08 - | infinity - | -infinity - | 1947-05-10 23:59:12-08 - | invalid -(7 rows) - -SET DateStyle TO 'European,SQL'; -SHOW DateStyle; - DateStyle ------------ - SQL, DMY -(1 row) - -SELECT '' AS "65", d1 AS european_sql FROM TIMESTAMP_TBL; - 65 | european_sql -----+------------------------ - | -infinity - | infinity - | 01/01/1970 00:00:00 - | 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 - | 02/01/1997 00:00:00 - | 02/01/1997 03:04:05 - | 10/02/1997 17:32:01 - | 10/02/1997 17:32:01 - | 10/02/1997 17:32:01 - | 10/02/1997 17:32:01 - | 10/06/1997 17:32:01 - | 22/09/2001 18:19:20 - | 15/03/2000 08:14:01 - | 15/03/2000 13:14:02 - | 15/03/2000 12:14:03 - | 15/03/2000 03:14:04 - | 15/03/2000 02:14:05 - | 10/02/1997 17:32:01 - | 10/02/1997 17:32:01 - | 10/02/1997 17:32:00 - | 10/02/1997 17:32:01 - | 10/02/1997 17:32:01 - | 10/02/1997 17:32:01 - | 10/02/1997 17:32:01 - | 10/02/1997 17:32:01 - | 10/02/1997 17:32:01 - | 10/02/1997 17:32:01 - | 10/02/1997 17:32:01 - | 10/06/1997 18:32:01 - | 10/02/1997 17:32:01 - | 11/02/1997 17:32:01 - | 12/02/1997 17:32:01 - | 13/02/1997 17:32:01 - | 14/02/1997 17:32:01 - | 15/02/1997 17:32:01 - | 16/02/1997 17:32:01 - | 16/02/0097 17:32:01 BC - | 16/02/0097 17:32:01 - | 16/02/0597 17:32:01 - | 16/02/1097 17:32:01 - | 16/02/1697 17:32:01 - | 16/02/1797 17:32:01 - | 16/02/1897 17:32:01 - | 16/02/1997 17:32:01 - | 16/02/2097 17:32:01 - | 28/02/1996 17:32:01 - | 29/02/1996 17:32:01 - | 01/03/1996 17:32:01 - | 30/12/1996 17:32:01 - | 31/12/1996 17:32:01 - | 01/01/1997 17:32:01 - | 28/02/1997 17:32:01 - | 01/03/1997 17:32:01 - | 30/12/1997 17:32:01 - | 31/12/1997 17:32:01 - | 31/12/1999 17:32:01 - | 01/01/2000 17:32:01 - | 31/12/2000 17:32:01 - | 01/01/2001 17:32:01 - | 13/06/1957 00:00:00 -(65 rows) - -SELECT '' AS seven, f1 AS european_sql FROM ABSTIME_TBL; - seven | european_sql --------+------------------------- - | 14/01/1973 03:14:21 PST - | 01/05/1995 00:30:30 PDT - | 31/12/1969 16:00:00 PST - | infinity - | -infinity - | 10/05/1947 23:59:12 PST - | invalid -(7 rows) - -RESET DateStyle; diff --git a/src/test/regress/expected/horology-solaris-1947.out b/src/test/regress/expected/horology-solaris-1947.out deleted file mode 100644 index 4636697a49..0000000000 --- a/src/test/regress/expected/horology-solaris-1947.out +++ /dev/null @@ -1,2924 +0,0 @@ --- --- HOROLOGY --- --- needed so tests pass even in Australia -SET australian_timezones = 'off'; -SET DateStyle = 'Postgres, MDY'; --- --- Test various input formats --- -SELECT timestamp with time zone '20011227 040506+08'; - timestamptz ------------------------------- - Wed Dec 26 12:05:06 2001 PST -(1 row) - -SELECT timestamp with time zone '20011227 040506-08'; - timestamptz ------------------------------- - Thu Dec 27 04:05:06 2001 PST -(1 row) - -SELECT timestamp with time zone '20011227 040506.789+08'; - timestamptz ----------------------------------- - Wed Dec 26 12:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone '20011227 040506.789-08'; - timestamptz ----------------------------------- - Thu Dec 27 04:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone '20011227T040506+08'; - timestamptz ------------------------------- - Wed Dec 26 12:05:06 2001 PST -(1 row) - -SELECT timestamp with time zone '20011227T040506-08'; - timestamptz ------------------------------- - Thu Dec 27 04:05:06 2001 PST -(1 row) - -SELECT timestamp with time zone '20011227T040506.789+08'; - timestamptz ----------------------------------- - Wed Dec 26 12:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone '20011227T040506.789-08'; - timestamptz ----------------------------------- - Thu Dec 27 04:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone '2001-12-27 04:05:06.789-08'; - timestamptz ----------------------------------- - Thu Dec 27 04:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone '2001.12.27 04:05:06.789-08'; - timestamptz ----------------------------------- - Thu Dec 27 04:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone '2001/12/27 04:05:06.789-08'; - timestamptz ----------------------------------- - Thu Dec 27 04:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone '12/27/2001 04:05:06.789-08'; - timestamptz ----------------------------------- - Thu Dec 27 04:05:06.789 2001 PST -(1 row) - --- should fail in mdy mode: -SELECT timestamp with time zone '27/12/2001 04:05:06.789-08'; -ERROR: date/time field value out of range: "27/12/2001 04:05:06.789-08" -HINT: Perhaps you need a different "datestyle" setting. -set datestyle to dmy; -SELECT timestamp with time zone '27/12/2001 04:05:06.789-08'; - timestamptz ----------------------------------- - Thu 27 Dec 04:05:06.789 2001 PST -(1 row) - -reset datestyle; -SELECT timestamp with time zone 'Y2001M12D27H04M05S06.789+08'; - timestamptz ----------------------------------- - Wed Dec 26 12:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone 'Y2001M12D27H04M05S06.789-08'; - timestamptz ----------------------------------- - Thu Dec 27 04:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone 'Y2001M12D27H04MM05S06.789+08'; - timestamptz ----------------------------------- - Wed Dec 26 12:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone 'Y2001M12D27H04MM05S06.789-08'; - timestamptz ----------------------------------- - Thu Dec 27 04:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone 'J2452271+08'; - timestamptz ------------------------------- - Wed Dec 26 08:00:00 2001 PST -(1 row) - -SELECT timestamp with time zone 'J2452271-08'; - timestamptz ------------------------------- - Thu Dec 27 00:00:00 2001 PST -(1 row) - -SELECT timestamp with time zone 'J2452271.5+08'; - timestamptz ------------------------------- - Wed Dec 26 20:00:00 2001 PST -(1 row) - -SELECT timestamp with time zone 'J2452271.5-08'; - timestamptz ------------------------------- - Thu Dec 27 12:00:00 2001 PST -(1 row) - -SELECT timestamp with time zone 'J2452271 04:05:06+08'; - timestamptz ------------------------------- - Wed Dec 26 12:05:06 2001 PST -(1 row) - -SELECT timestamp with time zone 'J2452271 04:05:06-08'; - timestamptz ------------------------------- - Thu Dec 27 04:05:06 2001 PST -(1 row) - -SELECT timestamp with time zone 'J2452271T040506+08'; - timestamptz ------------------------------- - Wed Dec 26 12:05:06 2001 PST -(1 row) - -SELECT timestamp with time zone 'J2452271T040506-08'; - timestamptz ------------------------------- - Thu Dec 27 04:05:06 2001 PST -(1 row) - -SELECT timestamp with time zone 'J2452271T040506.789+08'; - timestamptz ----------------------------------- - Wed Dec 26 12:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone 'J2452271T040506.789-08'; - timestamptz ----------------------------------- - Thu Dec 27 04:05:06.789 2001 PST -(1 row) - --- German/European-style dates with periods as delimiters -SELECT timestamp with time zone '12.27.2001 04:05:06.789+08'; - timestamptz ----------------------------------- - Wed Dec 26 12:05:06.789 2001 PST -(1 row) - -SELECT timestamp with time zone '12.27.2001 04:05:06.789-08'; - timestamptz ----------------------------------- - Thu Dec 27 04:05:06.789 2001 PST -(1 row) - -SET DateStyle = 'German'; -SELECT timestamp with time zone '27.12.2001 04:05:06.789+08'; - timestamptz ------------------------------ - 26.12.2001 12:05:06.789 PST -(1 row) - -SELECT timestamp with time zone '27.12.2001 04:05:06.789-08'; - timestamptz ------------------------------ - 27.12.2001 04:05:06.789 PST -(1 row) - -SET DateStyle = 'ISO'; --- As of 7.4, allow time without time zone having a time zone specified -SELECT time without time zone '040506.789+08'; - time ---------------- - 04:05:06.7890 -(1 row) - -SELECT time without time zone '040506.789-08'; - time ---------------- - 04:05:06.7890 -(1 row) - -SELECT time without time zone 'T040506.789+08'; - time ---------------- - 04:05:06.7890 -(1 row) - -SELECT time without time zone 'T040506.789-08'; - time ---------------- - 04:05:06.7890 -(1 row) - -SELECT time with time zone '040506.789+08'; - timetz ------------------- - 04:05:06.7890+08 -(1 row) - -SELECT time with time zone '040506.789-08'; - timetz ------------------- - 04:05:06.7890-08 -(1 row) - -SELECT time with time zone 'T040506.789+08'; - timetz ------------------- - 04:05:06.7890+08 -(1 row) - -SELECT time with time zone 'T040506.789-08'; - timetz ------------------- - 04:05:06.7890-08 -(1 row) - -SELECT time with time zone 'T040506.789 +08'; - timetz ------------------- - 04:05:06.7890+08 -(1 row) - -SELECT time with time zone 'T040506.789 -08'; - timetz ------------------- - 04:05:06.7890-08 -(1 row) - -SET DateStyle = 'Postgres, MDY'; --- --- date, time arithmetic --- -SELECT date '1981-02-03' + time '04:05:06' AS "Date + Time"; - Date + Time --------------------------- - Tue Feb 03 04:05:06 1981 -(1 row) - -SELECT date '1991-02-03' + time with time zone '04:05:06 PST' AS "Date + Time PST"; - Date + Time PST ------------------------------- - Sun Feb 03 04:05:06 1991 PST -(1 row) - -SELECT date '2001-02-03' + time with time zone '04:05:06 UTC' AS "Date + Time UTC"; - Date + Time UTC ------------------------------- - Fri Feb 02 20:05:06 2001 PST -(1 row) - -SELECT date '1991-02-03' + interval '2 years' AS "Add Two Years"; - Add Two Years --------------------------- - Wed Feb 03 00:00:00 1993 -(1 row) - -SELECT date '2001-12-13' - interval '2 years' AS "Subtract Two Years"; - Subtract Two Years --------------------------- - Mon Dec 13 00:00:00 1999 -(1 row) - --- subtract time from date should not make sense; use interval instead -SELECT date '1991-02-03' - time '04:05:06' AS "Subtract Time"; - Subtract Time --------------------------- - Sat Feb 02 19:54:54 1991 -(1 row) - -SELECT date '1991-02-03' - time with time zone '04:05:06 UTC' AS "Subtract Time UTC"; -ERROR: operator does not exist: date - time with time zone -HINT: No operator matches the given name and argument type(s). You may need to add explicit type casts. --- --- timestamp, interval arithmetic --- -SELECT timestamp without time zone '1996-03-01' - interval '1 second' AS "Feb 29"; - Feb 29 --------------------------- - Thu Feb 29 23:59:59 1996 -(1 row) - -SELECT timestamp without time zone '1999-03-01' - interval '1 second' AS "Feb 28"; - Feb 28 --------------------------- - Sun Feb 28 23:59:59 1999 -(1 row) - -SELECT timestamp without time zone '2000-03-01' - interval '1 second' AS "Feb 29"; - Feb 29 --------------------------- - Tue Feb 29 23:59:59 2000 -(1 row) - -SELECT timestamp without time zone '1999-12-01' + interval '1 month - 1 second' AS "Dec 31"; - Dec 31 --------------------------- - Fri Dec 31 23:59:59 1999 -(1 row) - -SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '106000000 days' AS "Feb 23, 285506"; - Feb 23, 285506 ----------------------------- - Fri Feb 23 00:00:00 285506 -(1 row) - -SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '107000000 days' AS "Jan 20, 288244"; - Jan 20, 288244 ----------------------------- - Sat Jan 20 00:00:00 288244 -(1 row) - -SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '109203489 days' AS "Dec 31, 294276"; - Dec 31, 294276 ----------------------------- - Sun Dec 31 00:00:00 294276 -(1 row) - -SELECT timestamp without time zone '12/31/294276' - timestamp without time zone '12/23/1999' AS "106751991 Days"; - 106751991 Days ------------------- - @ 106751991 days -(1 row) - --- Shorthand values --- Not directly usable for regression testing since these are not constants. --- So, just try to test parser and hope for the best - thomas 97/04/26 -SELECT (timestamp without time zone 'today' = (timestamp without time zone 'yesterday' + interval '1 day')) as "True"; - True ------- - t -(1 row) - -SELECT (timestamp without time zone 'today' = (timestamp without time zone 'tomorrow' - interval '1 day')) as "True"; - True ------- - t -(1 row) - -SELECT (timestamp without time zone 'tomorrow' = (timestamp without time zone 'yesterday' + interval '2 days')) as "True"; - True ------- - t -(1 row) - -SELECT (timestamp without time zone 'tomorrow' > 'now') as "True"; - True ------- - t -(1 row) - --- Convert from date and time to timestamp --- This test used to be timestamp(date,time) but no longer allowed by grammar --- to enable support for SQL99 timestamp type syntax. -SELECT date '1994-01-01' + time '11:00' AS "Jan_01_1994_11am"; - Jan_01_1994_11am --------------------------- - Sat Jan 01 11:00:00 1994 -(1 row) - -SELECT date '1994-01-01' + time '10:00' AS "Jan_01_1994_10am"; - Jan_01_1994_10am --------------------------- - Sat Jan 01 10:00:00 1994 -(1 row) - -SELECT date '1994-01-01' + timetz '11:00-5' AS "Jan_01_1994_8am"; - Jan_01_1994_8am ------------------------------- - Sat Jan 01 08:00:00 1994 PST -(1 row) - -SELECT timestamptz(date '1994-01-01', time with time zone '11:00-5') AS "Jan_01_1994_8am"; - Jan_01_1994_8am ------------------------------- - Sat Jan 01 08:00:00 1994 PST -(1 row) - -SELECT '' AS "64", d1 + interval '1 year' AS one_year FROM TIMESTAMP_TBL; - 64 | one_year -----+----------------------------- - | -infinity - | infinity - | Fri Jan 01 00:00:00 1971 - | 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 - | Fri Jan 02 00:00:00 1998 - | Fri Jan 02 03:04:05 1998 - | Tue Feb 10 17:32:01 1998 - | Tue Feb 10 17:32:01 1998 - | Tue Feb 10 17:32:01 1998 - | Tue Feb 10 17:32:01 1998 - | Wed Jun 10 17:32:01 1998 - | Sun Sep 22 18:19:20 2002 - | Thu Mar 15 08:14:01 2001 - | Thu Mar 15 13:14:02 2001 - | Thu Mar 15 12:14:03 2001 - | Thu Mar 15 03:14:04 2001 - | Thu Mar 15 02:14:05 2001 - | Tue Feb 10 17:32:01 1998 - | Tue Feb 10 17:32:01 1998 - | Tue Feb 10 17:32:00 1998 - | Tue Feb 10 17:32:01 1998 - | Tue Feb 10 17:32:01 1998 - | Tue Feb 10 17:32:01 1998 - | Tue Feb 10 17:32:01 1998 - | Tue Feb 10 17:32:01 1998 - | Tue Feb 10 17:32:01 1998 - | Tue Feb 10 17:32:01 1998 - | Tue Feb 10 17:32:01 1998 - | Wed Jun 10 18:32:01 1998 - | Tue Feb 10 17:32:01 1998 - | Wed Feb 11 17:32:01 1998 - | Thu Feb 12 17:32:01 1998 - | Fri Feb 13 17:32:01 1998 - | Sat Feb 14 17:32:01 1998 - | Sun Feb 15 17:32:01 1998 - | Mon Feb 16 17:32:01 1998 - | Thu Feb 16 17:32:01 0096 BC - | Sun Feb 16 17:32:01 0098 - | Fri Feb 16 17:32:01 0598 - | Wed Feb 16 17:32:01 1098 - | Sun Feb 16 17:32:01 1698 - | Fri Feb 16 17:32:01 1798 - | Wed Feb 16 17:32:01 1898 - | Mon Feb 16 17:32:01 1998 - | Sun Feb 16 17:32:01 2098 - | Fri Feb 28 17:32:01 1997 - | Fri Feb 28 17:32:01 1997 - | Sat Mar 01 17:32:01 1997 - | Tue Dec 30 17:32:01 1997 - | Wed Dec 31 17:32:01 1997 - | Thu Jan 01 17:32:01 1998 - | Sat Feb 28 17:32:01 1998 - | Sun Mar 01 17:32:01 1998 - | Wed Dec 30 17:32:01 1998 - | Thu Dec 31 17:32:01 1998 - | Sun Dec 31 17:32:01 2000 - | Mon Jan 01 17:32:01 2001 - | Mon Dec 31 17:32:01 2001 - | Tue Jan 01 17:32:01 2002 -(64 rows) - -SELECT '' AS "64", d1 - interval '1 year' AS one_year FROM TIMESTAMP_TBL; - 64 | one_year -----+----------------------------- - | -infinity - | infinity - | Wed Jan 01 00:00:00 1969 - | 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 - | Tue Jan 02 00:00:00 1996 - | Tue Jan 02 03:04:05 1996 - | Sat Feb 10 17:32:01 1996 - | Sat Feb 10 17:32:01 1996 - | Sat Feb 10 17:32:01 1996 - | Sat Feb 10 17:32:01 1996 - | Mon Jun 10 17:32:01 1996 - | Fri Sep 22 18:19:20 2000 - | Mon Mar 15 08:14:01 1999 - | Mon Mar 15 13:14:02 1999 - | Mon Mar 15 12:14:03 1999 - | Mon Mar 15 03:14:04 1999 - | Mon Mar 15 02:14:05 1999 - | Sat Feb 10 17:32:01 1996 - | Sat Feb 10 17:32:01 1996 - | Sat Feb 10 17:32:00 1996 - | Sat Feb 10 17:32:01 1996 - | Sat Feb 10 17:32:01 1996 - | Sat Feb 10 17:32:01 1996 - | Sat Feb 10 17:32:01 1996 - | Sat Feb 10 17:32:01 1996 - | Sat Feb 10 17:32:01 1996 - | Sat Feb 10 17:32:01 1996 - | Sat Feb 10 17:32:01 1996 - | Mon Jun 10 18:32:01 1996 - | Sat Feb 10 17:32:01 1996 - | Sun Feb 11 17:32:01 1996 - | Mon Feb 12 17:32:01 1996 - | Tue Feb 13 17:32:01 1996 - | Wed Feb 14 17:32:01 1996 - | Thu Feb 15 17:32:01 1996 - | Fri Feb 16 17:32:01 1996 - | Mon Feb 16 17:32:01 0098 BC - | Thu Feb 16 17:32:01 0096 - | Tue Feb 16 17:32:01 0596 - | Sun Feb 16 17:32:01 1096 - | Thu Feb 16 17:32:01 1696 - | Tue Feb 16 17:32:01 1796 - | Sun Feb 16 17:32:01 1896 - | Fri Feb 16 17:32:01 1996 - | Thu Feb 16 17:32:01 2096 - | Tue Feb 28 17:32:01 1995 - | Tue Feb 28 17:32:01 1995 - | Wed Mar 01 17:32:01 1995 - | Sat Dec 30 17:32:01 1995 - | Sun Dec 31 17:32:01 1995 - | Mon Jan 01 17:32:01 1996 - | Wed Feb 28 17:32:01 1996 - | Fri Mar 01 17:32:01 1996 - | Mon Dec 30 17:32:01 1996 - | Tue Dec 31 17:32:01 1996 - | Thu Dec 31 17:32:01 1998 - | Fri Jan 01 17:32:01 1999 - | Fri Dec 31 17:32:01 1999 - | Sat Jan 01 17:32:01 2000 -(64 rows) - -SELECT timestamp with time zone '1996-03-01' - interval '1 second' AS "Feb 29"; - Feb 29 ------------------------------- - Thu Feb 29 23:59:59 1996 PST -(1 row) - -SELECT timestamp with time zone '1999-03-01' - interval '1 second' AS "Feb 28"; - Feb 28 ------------------------------- - Sun Feb 28 23:59:59 1999 PST -(1 row) - -SELECT timestamp with time zone '2000-03-01' - interval '1 second' AS "Feb 29"; - Feb 29 ------------------------------- - Tue Feb 29 23:59:59 2000 PST -(1 row) - -SELECT timestamp with time zone '1999-12-01' + interval '1 month - 1 second' AS "Dec 31"; - Dec 31 ------------------------------- - Fri Dec 31 23:59:59 1999 PST -(1 row) - -SELECT (timestamp with time zone 'today' = (timestamp with time zone 'yesterday' + interval '1 day')) as "True"; - True ------- - t -(1 row) - -SELECT (timestamp with time zone 'today' = (timestamp with time zone 'tomorrow' - interval '1 day')) as "True"; - True ------- - t -(1 row) - -SELECT (timestamp with time zone 'tomorrow' = (timestamp with time zone 'yesterday' + interval '2 days')) as "True"; - True ------- - t -(1 row) - -SELECT (timestamp with time zone 'tomorrow' > 'now') as "True"; - True ------- - t -(1 row) - -SELECT timestamptz(date '1994-01-01', time '11:00') AS "Jan_01_1994_10am"; - Jan_01_1994_10am ------------------------------- - Sat Jan 01 11:00:00 1994 PST -(1 row) - -SELECT timestamptz(date '1994-01-01', time '10:00') AS "Jan_01_1994_9am"; - Jan_01_1994_9am ------------------------------- - Sat Jan 01 10:00:00 1994 PST -(1 row) - -SELECT timestamptz(date '1994-01-01', time with time zone '11:00-8') AS "Jan_01_1994_11am"; - Jan_01_1994_11am ------------------------------- - Sat Jan 01 11:00:00 1994 PST -(1 row) - -SELECT timestamptz(date '1994-01-01', time with time zone '10:00-8') AS "Jan_01_1994_10am"; - Jan_01_1994_10am ------------------------------- - Sat Jan 01 10:00:00 1994 PST -(1 row) - -SELECT timestamptz(date '1994-01-01', time with time zone '11:00-5') AS "Jan_01_1994_8am"; - Jan_01_1994_8am ------------------------------- - Sat Jan 01 08:00:00 1994 PST -(1 row) - -SELECT '' AS "64", d1 + interval '1 year' AS one_year FROM TIMESTAMPTZ_TBL; - 64 | one_year -----+--------------------------------- - | -infinity - | infinity - | Thu Dec 31 16:00:00 1970 PST - | Tue Feb 10 17:32:01 1998 PST - | Tue Feb 10 17:32:01 1998 PST - | Tue Feb 10 17:32:02 1998 PST - | Tue Feb 10 17:32:01.40 1998 PST - | Tue Feb 10 17:32:01.50 1998 PST - | Tue Feb 10 17:32:01.60 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 - | Tue Feb 10 17:32:01 1998 PST - | Tue Feb 10 17:32:01 1998 PST - | Tue Feb 10 17:32:01 1998 PST - | Wed Jun 10 17:32:01 1998 PDT - | Sun Sep 22 18:19:20 2002 PDT - | Thu Mar 15 08:14:01 2001 PST - | Thu Mar 15 04:14:02 2001 PST - | Thu Mar 15 02:14:03 2001 PST - | Thu Mar 15 03:14:04 2001 PST - | Thu Mar 15 01:14:05 2001 PST - | Tue Feb 10 17:32:01 1998 PST - | Tue Feb 10 17:32:01 1998 PST - | Tue Feb 10 17:32:00 1998 PST - | Tue Feb 10 17:32:01 1998 PST - | Tue Feb 10 17:32:01 1998 PST - | Tue Feb 10 17:32:01 1998 PST - | Tue Feb 10 17:32:01 1998 PST - | Tue Feb 10 17:32:01 1998 PST - | Tue Feb 10 09:32:01 1998 PST - | Tue Feb 10 09:32:01 1998 PST - | Tue Feb 10 09:32:01 1998 PST - | Wed Jun 10 18:32:01 1998 PDT - | Tue Feb 10 17:32:01 1998 PST - | Wed Feb 11 17:32:01 1998 PST - | Thu Feb 12 17:32:01 1998 PST - | Fri Feb 13 17:32:01 1998 PST - | Sat Feb 14 17:32:01 1998 PST - | Sun Feb 15 17:32:01 1998 PST - | Mon Feb 16 17:32:01 1998 PST - | Thu Feb 16 17:32:01 0096 BC - | Sun Feb 16 17:32:01 0098 - | Fri Feb 16 17:32:01 0598 - | Wed Feb 16 17:32:01 1098 - | Sun Feb 16 17:32:01 1698 - | Fri Feb 16 17:32:01 1798 - | Wed Feb 16 17:32:01 1898 - | Mon Feb 16 17:32:01 1998 PST - | Sun Feb 16 17:32:01 2098 - | Fri Feb 28 17:32:01 1997 PST - | Fri Feb 28 17:32:01 1997 PST - | Sat Mar 01 17:32:01 1997 PST - | Tue Dec 30 17:32:01 1997 PST - | Wed Dec 31 17:32:01 1997 PST - | Thu Jan 01 17:32:01 1998 PST - | Sat Feb 28 17:32:01 1998 PST - | Sun Mar 01 17:32:01 1998 PST - | Wed Dec 30 17:32:01 1998 PST - | Thu Dec 31 17:32:01 1998 PST - | Sun Dec 31 17:32:01 2000 PST - | Mon Jan 01 17:32:01 2001 PST - | Mon Dec 31 17:32:01 2001 PST - | Tue Jan 01 17:32:01 2002 PST -(64 rows) - -SELECT '' AS "64", d1 - interval '1 year' AS one_year FROM TIMESTAMPTZ_TBL; - 64 | one_year -----+--------------------------------- - | -infinity - | infinity - | Tue Dec 31 16:00:00 1968 PST - | Sat Feb 10 17:32:01 1996 PST - | Sat Feb 10 17:32:01 1996 PST - | Sat Feb 10 17:32:02 1996 PST - | Sat Feb 10 17:32:01.40 1996 PST - | Sat Feb 10 17:32:01.50 1996 PST - | Sat Feb 10 17:32:01.60 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 - | Sat Feb 10 17:32:01 1996 PST - | Sat Feb 10 17:32:01 1996 PST - | Sat Feb 10 17:32:01 1996 PST - | Mon Jun 10 17:32:01 1996 PDT - | Fri Sep 22 18:19:20 2000 PDT - | Mon Mar 15 08:14:01 1999 PST - | Mon Mar 15 04:14:02 1999 PST - | Mon Mar 15 02:14:03 1999 PST - | Mon Mar 15 03:14:04 1999 PST - | Mon Mar 15 01:14:05 1999 PST - | Sat Feb 10 17:32:01 1996 PST - | Sat Feb 10 17:32:01 1996 PST - | Sat Feb 10 17:32:00 1996 PST - | Sat Feb 10 17:32:01 1996 PST - | Sat Feb 10 17:32:01 1996 PST - | Sat Feb 10 17:32:01 1996 PST - | Sat Feb 10 17:32:01 1996 PST - | Sat Feb 10 17:32:01 1996 PST - | Sat Feb 10 09:32:01 1996 PST - | Sat Feb 10 09:32:01 1996 PST - | Sat Feb 10 09:32:01 1996 PST - | Mon Jun 10 18:32:01 1996 PDT - | Sat Feb 10 17:32:01 1996 PST - | Sun Feb 11 17:32:01 1996 PST - | Mon Feb 12 17:32:01 1996 PST - | Tue Feb 13 17:32:01 1996 PST - | Wed Feb 14 17:32:01 1996 PST - | Thu Feb 15 17:32:01 1996 PST - | Fri Feb 16 17:32:01 1996 PST - | Mon Feb 16 17:32:01 0098 BC - | Thu Feb 16 17:32:01 0096 - | Tue Feb 16 17:32:01 0596 - | Sun Feb 16 17:32:01 1096 - | Thu Feb 16 17:32:01 1696 - | Tue Feb 16 17:32:01 1796 - | Sun Feb 16 17:32:01 1896 - | Fri Feb 16 17:32:01 1996 PST - | Thu Feb 16 17:32:01 2096 - | Tue Feb 28 17:32:01 1995 PST - | Tue Feb 28 17:32:01 1995 PST - | Wed Mar 01 17:32:01 1995 PST - | Sat Dec 30 17:32:01 1995 PST - | Sun Dec 31 17:32:01 1995 PST - | Mon Jan 01 17:32:01 1996 PST - | Wed Feb 28 17:32:01 1996 PST - | Fri Mar 01 17:32:01 1996 PST - | Mon Dec 30 17:32:01 1996 PST - | Tue Dec 31 17:32:01 1996 PST - | Thu Dec 31 17:32:01 1998 PST - | Fri Jan 01 17:32:01 1999 PST - | Fri Dec 31 17:32:01 1999 PST - | Sat Jan 01 17:32:01 2000 PST -(64 rows) - --- --- time, interval arithmetic --- -SELECT CAST(time '01:02' AS interval) AS "+01:02"; - +01:02 ------------------ - @ 1 hour 2 mins -(1 row) - -SELECT CAST(interval '02:03' AS time) AS "02:03:00"; - 02:03:00 ----------- - 02:03:00 -(1 row) - -SELECT time '01:30' + interval '02:01' AS "03:31:00"; - 03:31:00 ----------- - 03:31:00 -(1 row) - -SELECT time '01:30' - interval '02:01' AS "23:29:00"; - 23:29:00 ----------- - 23:29:00 -(1 row) - -SELECT time '02:30' + interval '36:01' AS "14:31:00"; - 14:31:00 ----------- - 14:31:00 -(1 row) - -SELECT time '03:30' + interval '1 month 04:01' AS "07:31:00"; - 07:31:00 ----------- - 07:31:00 -(1 row) - -SELECT interval '04:30' - time '01:02' AS "20:32:00"; - 20:32:00 ----------- - 20:32:00 -(1 row) - -SELECT CAST(time with time zone '01:02-08' AS interval) AS "+00:01"; -ERROR: cannot cast type time with time zone to interval -SELECT CAST(interval '02:03' AS time with time zone) AS "02:03:00-08"; -ERROR: cannot cast type interval to time with time zone -SELECT time with time zone '01:30-08' - interval '02:01' AS "23:29:00-08"; - 23:29:00-08 -------------- - 23:29:00-08 -(1 row) - -SELECT time with time zone '02:30-08' + interval '36:01' AS "14:31:00-08"; - 14:31:00-08 -------------- - 14:31:00-08 -(1 row) - --- These two tests cannot be used because they default to current timezone, --- which may be either -08 or -07 depending on the time of year. --- SELECT time with time zone '01:30' + interval '02:01' AS "03:31:00-08"; --- SELECT time with time zone '03:30' + interval '1 month 04:01' AS "07:31:00-08"; --- Try the following two tests instead, as a poor substitute -SELECT CAST(CAST(date 'today' + time with time zone '01:30' - + interval '02:01' AS time with time zone) AS time) AS "03:31:00"; - 03:31:00 ----------- - 03:31:00 -(1 row) - -SELECT CAST(cast(date 'today' + time with time zone '03:30' - + interval '1 month 04:01' as timestamp without time zone) AS time) AS "07:31:00"; - 07:31:00 ----------- - 07:31:00 -(1 row) - -SELECT interval '04:30' - time with time zone '01:02-05' AS "20:32:00-05"; - 20:32:00-05 -------------- - 20:32:00-05 -(1 row) - -SELECT t.d1 + i.f1 AS "102" FROM TIMESTAMP_TBL t, INTERVAL_TBL i - WHERE t.d1 BETWEEN '1990-01-01' AND '2001-01-01' - AND i.f1 BETWEEN '00:00' AND '23:00'; - 102 ------------------------------ - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:02 1997 - Mon Feb 10 22:32:02 1997 - Mon Feb 10 17:33:01.40 1997 - Mon Feb 10 22:32:01.40 1997 - Mon Feb 10 17:33:01.50 1997 - Mon Feb 10 22:32:01.50 1997 - Mon Feb 10 17:33:01.60 1997 - Mon Feb 10 22:32:01.60 1997 - Thu Jan 02 00:01:00 1997 - Thu Jan 02 05:00:00 1997 - Thu Jan 02 03:05:05 1997 - Thu Jan 02 08:04:05 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Tue Jun 10 17:33:01 1997 - Tue Jun 10 22:32:01 1997 - Wed Mar 15 08:15:01 2000 - Wed Mar 15 13:14:01 2000 - Wed Mar 15 13:15:02 2000 - Wed Mar 15 18:14:02 2000 - Wed Mar 15 12:15:03 2000 - Wed Mar 15 17:14:03 2000 - Wed Mar 15 03:15:04 2000 - Wed Mar 15 08:14:04 2000 - Wed Mar 15 02:15:05 2000 - Wed Mar 15 07:14:05 2000 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:00 1997 - Mon Feb 10 22:32:00 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Tue Jun 10 18:33:01 1997 - Tue Jun 10 23:32:01 1997 - Mon Feb 10 17:33:01 1997 - Mon Feb 10 22:32:01 1997 - Tue Feb 11 17:33:01 1997 - Tue Feb 11 22:32:01 1997 - Wed Feb 12 17:33:01 1997 - Wed Feb 12 22:32:01 1997 - Thu Feb 13 17:33:01 1997 - Thu Feb 13 22:32:01 1997 - Fri Feb 14 17:33:01 1997 - Fri Feb 14 22:32:01 1997 - Sat Feb 15 17:33:01 1997 - Sat Feb 15 22:32:01 1997 - Sun Feb 16 17:33:01 1997 - Sun Feb 16 22:32:01 1997 - Sun Feb 16 17:33:01 1997 - Sun Feb 16 22:32:01 1997 - Wed Feb 28 17:33:01 1996 - Wed Feb 28 22:32:01 1996 - Thu Feb 29 17:33:01 1996 - Thu Feb 29 22:32:01 1996 - Fri Mar 01 17:33:01 1996 - Fri Mar 01 22:32:01 1996 - Mon Dec 30 17:33:01 1996 - Mon Dec 30 22:32:01 1996 - Tue Dec 31 17:33:01 1996 - Tue Dec 31 22:32:01 1996 - Wed Jan 01 17:33:01 1997 - Wed Jan 01 22:32:01 1997 - Fri Feb 28 17:33:01 1997 - Fri Feb 28 22:32:01 1997 - Sat Mar 01 17:33:01 1997 - Sat Mar 01 22:32:01 1997 - Tue Dec 30 17:33:01 1997 - Tue Dec 30 22:32:01 1997 - Wed Dec 31 17:33:01 1997 - Wed Dec 31 22:32:01 1997 - Fri Dec 31 17:33:01 1999 - Fri Dec 31 22:32:01 1999 - Sat Jan 01 17:33:01 2000 - Sat Jan 01 22:32:01 2000 - Sun Dec 31 17:33:01 2000 - Sun Dec 31 22:32:01 2000 -(102 rows) - -SELECT t.d1 - i.f1 AS "102" FROM TIMESTAMP_TBL t, INTERVAL_TBL i - WHERE t.d1 BETWEEN '1990-01-01' AND '2001-01-01' - AND i.f1 BETWEEN '00:00' AND '23:00'; - 102 ------------------------------ - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:02 1997 - Mon Feb 10 12:32:02 1997 - Mon Feb 10 17:31:01.40 1997 - Mon Feb 10 12:32:01.40 1997 - Mon Feb 10 17:31:01.50 1997 - Mon Feb 10 12:32:01.50 1997 - Mon Feb 10 17:31:01.60 1997 - Mon Feb 10 12:32:01.60 1997 - Wed Jan 01 23:59:00 1997 - Wed Jan 01 19:00:00 1997 - Thu Jan 02 03:03:05 1997 - Wed Jan 01 22:04:05 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Tue Jun 10 17:31:01 1997 - Tue Jun 10 12:32:01 1997 - Wed Mar 15 08:13:01 2000 - Wed Mar 15 03:14:01 2000 - Wed Mar 15 13:13:02 2000 - Wed Mar 15 08:14:02 2000 - Wed Mar 15 12:13:03 2000 - Wed Mar 15 07:14:03 2000 - Wed Mar 15 03:13:04 2000 - Tue Mar 14 22:14:04 2000 - Wed Mar 15 02:13:05 2000 - Tue Mar 14 21:14:05 2000 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:00 1997 - Mon Feb 10 12:32:00 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Tue Jun 10 18:31:01 1997 - Tue Jun 10 13:32:01 1997 - Mon Feb 10 17:31:01 1997 - Mon Feb 10 12:32:01 1997 - Tue Feb 11 17:31:01 1997 - Tue Feb 11 12:32:01 1997 - Wed Feb 12 17:31:01 1997 - Wed Feb 12 12:32:01 1997 - Thu Feb 13 17:31:01 1997 - Thu Feb 13 12:32:01 1997 - Fri Feb 14 17:31:01 1997 - Fri Feb 14 12:32:01 1997 - Sat Feb 15 17:31:01 1997 - Sat Feb 15 12:32:01 1997 - Sun Feb 16 17:31:01 1997 - Sun Feb 16 12:32:01 1997 - Sun Feb 16 17:31:01 1997 - Sun Feb 16 12:32:01 1997 - Wed Feb 28 17:31:01 1996 - Wed Feb 28 12:32:01 1996 - Thu Feb 29 17:31:01 1996 - Thu Feb 29 12:32:01 1996 - Fri Mar 01 17:31:01 1996 - Fri Mar 01 12:32:01 1996 - Mon Dec 30 17:31:01 1996 - Mon Dec 30 12:32:01 1996 - Tue Dec 31 17:31:01 1996 - Tue Dec 31 12:32:01 1996 - Wed Jan 01 17:31:01 1997 - Wed Jan 01 12:32:01 1997 - Fri Feb 28 17:31:01 1997 - Fri Feb 28 12:32:01 1997 - Sat Mar 01 17:31:01 1997 - Sat Mar 01 12:32:01 1997 - Tue Dec 30 17:31:01 1997 - Tue Dec 30 12:32:01 1997 - Wed Dec 31 17:31:01 1997 - Wed Dec 31 12:32:01 1997 - Fri Dec 31 17:31:01 1999 - Fri Dec 31 12:32:01 1999 - Sat Jan 01 17:31:01 2000 - Sat Jan 01 12:32:01 2000 - Sun Dec 31 17:31:01 2000 - Sun Dec 31 12:32:01 2000 -(102 rows) - -SELECT t.f1 + i.f1 AS "80" FROM TIME_TBL t, INTERVAL_TBL i; - 80 -------------- - 00:01:00 - 05:00:00 - 00:00:00 - 00:00:00 - 00:00:00 - 23:59:46 - 02:03:04 - 00:00:00 - 00:00:00 - 12:00:00 - 01:01:00 - 06:00:00 - 01:00:00 - 01:00:00 - 01:00:00 - 00:59:46 - 03:03:04 - 01:00:00 - 01:00:00 - 13:00:00 - 02:04:00 - 07:03:00 - 02:03:00 - 02:03:00 - 02:03:00 - 02:02:46 - 04:06:04 - 02:03:00 - 02:03:00 - 14:03:00 - 12:00:00 - 16:59:00 - 11:59:00 - 11:59:00 - 11:59:00 - 11:58:46 - 14:02:04 - 11:59:00 - 11:59:00 - 23:59:00 - 12:01:00 - 17:00:00 - 12:00:00 - 12:00:00 - 12:00:00 - 11:59:46 - 14:03:04 - 12:00:00 - 12:00:00 - 00:00:00 - 12:02:00 - 17:01:00 - 12:01:00 - 12:01:00 - 12:01:00 - 12:00:46 - 14:04:04 - 12:01:00 - 12:01:00 - 00:01:00 - 00:00:00 - 04:59:00 - 23:59:00 - 23:59:00 - 23:59:00 - 23:58:46 - 02:02:04 - 23:59:00 - 23:59:00 - 11:59:00 - 00:00:59.99 - 04:59:59.99 - 23:59:59.99 - 23:59:59.99 - 23:59:59.99 - 23:59:45.99 - 02:03:03.99 - 23:59:59.99 - 23:59:59.99 - 11:59:59.99 -(80 rows) - -SELECT t.f1 - i.f1 AS "80" FROM TIME_TBL t, INTERVAL_TBL i; - 80 -------------- - 23:59:00 - 19:00:00 - 00:00:00 - 00:00:00 - 00:00:00 - 00:00:14 - 21:56:56 - 00:00:00 - 00:00:00 - 12:00:00 - 00:59:00 - 20:00:00 - 01:00:00 - 01:00:00 - 01:00:00 - 01:00:14 - 22:56:56 - 01:00:00 - 01:00:00 - 13:00:00 - 02:02:00 - 21:03:00 - 02:03:00 - 02:03:00 - 02:03:00 - 02:03:14 - 23:59:56 - 02:03:00 - 02:03:00 - 14:03:00 - 11:58:00 - 06:59:00 - 11:59:00 - 11:59:00 - 11:59:00 - 11:59:14 - 09:55:56 - 11:59:00 - 11:59:00 - 23:59:00 - 11:59:00 - 07:00:00 - 12:00:00 - 12:00:00 - 12:00:00 - 12:00:14 - 09:56:56 - 12:00:00 - 12:00:00 - 00:00:00 - 12:00:00 - 07:01:00 - 12:01:00 - 12:01:00 - 12:01:00 - 12:01:14 - 09:57:56 - 12:01:00 - 12:01:00 - 00:01:00 - 23:58:00 - 18:59:00 - 23:59:00 - 23:59:00 - 23:59:00 - 23:59:14 - 21:55:56 - 23:59:00 - 23:59:00 - 11:59:00 - 23:58:59.99 - 18:59:59.99 - 23:59:59.99 - 23:59:59.99 - 23:59:59.99 - 00:00:13.99 - 21:56:55.99 - 23:59:59.99 - 23:59:59.99 - 11:59:59.99 -(80 rows) - -SELECT t.f1 + i.f1 AS "100" FROM TIMETZ_TBL t, INTERVAL_TBL i; - 100 ----------------- - 00:02:00-07 - 05:01:00-07 - 00:01:00-07 - 00:01:00-07 - 00:01:00-07 - 00:00:46-07 - 02:04:04-07 - 00:01:00-07 - 00:01:00-07 - 12:01:00-07 - 01:01:00-07 - 06:00:00-07 - 01:00:00-07 - 01:00:00-07 - 01:00:00-07 - 00:59:46-07 - 03:03:04-07 - 01:00:00-07 - 01:00:00-07 - 13:00:00-07 - 02:04:00-07 - 07:03:00-07 - 02:03:00-07 - 02:03:00-07 - 02:03:00-07 - 02:02:46-07 - 04:06:04-07 - 02:03:00-07 - 02:03:00-07 - 14:03:00-07 - 07:08:00-08 - 12:07:00-08 - 07:07:00-08 - 07:07:00-08 - 07:07:00-08 - 07:06:46-08 - 09:10:04-08 - 07:07:00-08 - 07:07:00-08 - 19:07:00-08 - 08:09:00-04 - 13:08:00-04 - 08:08:00-04 - 08:08:00-04 - 08:08:00-04 - 08:07:46-04 - 10:11:04-04 - 08:08:00-04 - 08:08:00-04 - 20:08:00-04 - 12:00:00-07 - 16:59:00-07 - 11:59:00-07 - 11:59:00-07 - 11:59:00-07 - 11:58:46-07 - 14:02:04-07 - 11:59:00-07 - 11:59:00-07 - 23:59:00-07 - 12:01:00-07 - 17:00:00-07 - 12:00:00-07 - 12:00:00-07 - 12:00:00-07 - 11:59:46-07 - 14:03:04-07 - 12:00:00-07 - 12:00:00-07 - 00:00:00-07 - 12:02:00-07 - 17:01:00-07 - 12:01:00-07 - 12:01:00-07 - 12:01:00-07 - 12:00:46-07 - 14:04:04-07 - 12:01:00-07 - 12:01:00-07 - 00:01:00-07 - 00:00:00-07 - 04:59:00-07 - 23:59:00-07 - 23:59:00-07 - 23:59:00-07 - 23:58:46-07 - 02:02:04-07 - 23:59:00-07 - 23:59:00-07 - 11:59:00-07 - 00:00:59.99-07 - 04:59:59.99-07 - 23:59:59.99-07 - 23:59:59.99-07 - 23:59:59.99-07 - 23:59:45.99-07 - 02:03:03.99-07 - 23:59:59.99-07 - 23:59:59.99-07 - 11:59:59.99-07 -(100 rows) - -SELECT t.f1 - i.f1 AS "100" FROM TIMETZ_TBL t, INTERVAL_TBL i; - 100 ----------------- - 00:00:00-07 - 19:01:00-07 - 00:01:00-07 - 00:01:00-07 - 00:01:00-07 - 00:01:14-07 - 21:57:56-07 - 00:01:00-07 - 00:01:00-07 - 12:01:00-07 - 00:59:00-07 - 20:00:00-07 - 01:00:00-07 - 01:00:00-07 - 01:00:00-07 - 01:00:14-07 - 22:56:56-07 - 01:00:00-07 - 01:00:00-07 - 13:00:00-07 - 02:02:00-07 - 21:03:00-07 - 02:03:00-07 - 02:03:00-07 - 02:03:00-07 - 02:03:14-07 - 23:59:56-07 - 02:03:00-07 - 02:03:00-07 - 14:03:00-07 - 07:06:00-08 - 02:07:00-08 - 07:07:00-08 - 07:07:00-08 - 07:07:00-08 - 07:07:14-08 - 05:03:56-08 - 07:07:00-08 - 07:07:00-08 - 19:07:00-08 - 08:07:00-04 - 03:08:00-04 - 08:08:00-04 - 08:08:00-04 - 08:08:00-04 - 08:08:14-04 - 06:04:56-04 - 08:08:00-04 - 08:08:00-04 - 20:08:00-04 - 11:58:00-07 - 06:59:00-07 - 11:59:00-07 - 11:59:00-07 - 11:59:00-07 - 11:59:14-07 - 09:55:56-07 - 11:59:00-07 - 11:59:00-07 - 23:59:00-07 - 11:59:00-07 - 07:00:00-07 - 12:00:00-07 - 12:00:00-07 - 12:00:00-07 - 12:00:14-07 - 09:56:56-07 - 12:00:00-07 - 12:00:00-07 - 00:00:00-07 - 12:00:00-07 - 07:01:00-07 - 12:01:00-07 - 12:01:00-07 - 12:01:00-07 - 12:01:14-07 - 09:57:56-07 - 12:01:00-07 - 12:01:00-07 - 00:01:00-07 - 23:58:00-07 - 18:59:00-07 - 23:59:00-07 - 23:59:00-07 - 23:59:00-07 - 23:59:14-07 - 21:55:56-07 - 23:59:00-07 - 23:59:00-07 - 11:59:00-07 - 23:58:59.99-07 - 18:59:59.99-07 - 23:59:59.99-07 - 23:59:59.99-07 - 23:59:59.99-07 - 00:00:13.99-07 - 21:56:55.99-07 - 23:59:59.99-07 - 23:59:59.99-07 - 11:59:59.99-07 -(100 rows) - --- SQL9x OVERLAPS operator --- test with time zone -SELECT (timestamp with time zone '2000-11-27', timestamp with time zone '2000-11-28') - OVERLAPS (timestamp with time zone '2000-11-27 12:00', timestamp with time zone '2000-11-30') AS "True"; - True ------- - t -(1 row) - -SELECT (timestamp with time zone '2000-11-26', timestamp with time zone '2000-11-27') - OVERLAPS (timestamp with time zone '2000-11-27 12:00', timestamp with time zone '2000-11-30') AS "False"; - False -------- - f -(1 row) - -SELECT (timestamp with time zone '2000-11-27', timestamp with time zone '2000-11-28') - OVERLAPS (timestamp with time zone '2000-11-27 12:00', interval '1 day') AS "True"; - True ------- - t -(1 row) - -SELECT (timestamp with time zone '2000-11-27', interval '12 hours') - OVERLAPS (timestamp with time zone '2000-11-27 12:00', timestamp with time zone '2000-11-30') AS "False"; - False -------- - f -(1 row) - -SELECT (timestamp with time zone '2000-11-27', interval '12 hours') - OVERLAPS (timestamp with time zone '2000-11-27', interval '12 hours') AS "True"; - True ------- - t -(1 row) - -SELECT (timestamp with time zone '2000-11-27', interval '12 hours') - OVERLAPS (timestamp with time zone '2000-11-27 12:00', interval '12 hours') AS "False"; - False -------- - f -(1 row) - --- test without time zone -SELECT (timestamp without time zone '2000-11-27', timestamp without time zone '2000-11-28') - OVERLAPS (timestamp without time zone '2000-11-27 12:00', timestamp without time zone '2000-11-30') AS "True"; - True ------- - t -(1 row) - -SELECT (timestamp without time zone '2000-11-26', timestamp without time zone '2000-11-27') - OVERLAPS (timestamp without time zone '2000-11-27 12:00', timestamp without time zone '2000-11-30') AS "False"; - False -------- - f -(1 row) - -SELECT (timestamp without time zone '2000-11-27', timestamp without time zone '2000-11-28') - OVERLAPS (timestamp without time zone '2000-11-27 12:00', interval '1 day') AS "True"; - True ------- - t -(1 row) - -SELECT (timestamp without time zone '2000-11-27', interval '12 hours') - OVERLAPS (timestamp without time zone '2000-11-27 12:00', timestamp without time zone '2000-11-30') AS "False"; - False -------- - f -(1 row) - -SELECT (timestamp without time zone '2000-11-27', interval '12 hours') - OVERLAPS (timestamp without time zone '2000-11-27', interval '12 hours') AS "True"; - True ------- - t -(1 row) - -SELECT (timestamp without time zone '2000-11-27', interval '12 hours') - OVERLAPS (timestamp without time zone '2000-11-27 12:00', interval '12 hours') AS "False"; - False -------- - f -(1 row) - --- test time and interval -SELECT (time '00:00', time '01:00') - OVERLAPS (time '00:30', time '01:30') AS "True"; - True ------- - t -(1 row) - -SELECT (time '00:00', interval '1 hour') - OVERLAPS (time '00:30', interval '1 hour') AS "True"; - True ------- - t -(1 row) - -SELECT (time '00:00', interval '1 hour') - OVERLAPS (time '01:30', interval '1 hour') AS "False"; - False -------- - f -(1 row) - --- SQL99 seems to want this to be false (and we conform to the spec). --- istm that this *should* return true, on the theory that time --- intervals can wrap around the day boundary - thomas 2001-09-25 -SELECT (time '00:00', interval '1 hour') - OVERLAPS (time '01:30', interval '1 day') AS "False"; - False -------- - f -(1 row) - -CREATE TABLE TEMP_TIMESTAMP (f1 timestamp with time zone); --- get some candidate input values -INSERT INTO TEMP_TIMESTAMP (f1) - SELECT d1 FROM TIMESTAMP_TBL - WHERE d1 BETWEEN '13-jun-1957' AND '1-jan-1997' - OR d1 BETWEEN '1-jan-1999' AND '1-jan-2010'; -SELECT '' AS "16", f1 AS "timestamp" - FROM TEMP_TIMESTAMP - ORDER BY "timestamp"; - 16 | timestamp -----+------------------------------ - | Thu Jan 01 00:00:00 1970 PST - | Wed Feb 28 17:32:01 1996 PST - | Thu Feb 29 17:32:01 1996 PST - | Fri Mar 01 17:32:01 1996 PST - | Mon Dec 30 17:32:01 1996 PST - | Tue Dec 31 17:32:01 1996 PST - | Fri Dec 31 17:32:01 1999 PST - | Sat Jan 01 17:32:01 2000 PST - | Wed Mar 15 02:14:05 2000 PST - | Wed Mar 15 03:14:04 2000 PST - | Wed Mar 15 08:14:01 2000 PST - | Wed Mar 15 12:14:03 2000 PST - | Wed Mar 15 13:14:02 2000 PST - | Sun Dec 31 17:32:01 2000 PST - | Mon Jan 01 17:32:01 2001 PST - | Sat Sep 22 18:19:20 2001 PDT -(16 rows) - -SELECT '' AS "160", d.f1 AS "timestamp", t.f1 AS "interval", d.f1 + t.f1 AS plus - FROM TEMP_TIMESTAMP d, INTERVAL_TBL t - ORDER BY plus, "timestamp", "interval"; - 160 | timestamp | interval | plus ------+------------------------------+-------------------------------+------------------------------ - | Thu Jan 01 00:00:00 1970 PST | @ 14 secs ago | Wed Dec 31 23:59:46 1969 PST - | Thu Jan 01 00:00:00 1970 PST | @ 1 min | Thu Jan 01 00:01:00 1970 PST - | Thu Jan 01 00:00:00 1970 PST | @ 5 hours | Thu Jan 01 05:00:00 1970 PST - | Thu Jan 01 00:00:00 1970 PST | @ 1 day 2 hours 3 mins 4 secs | Fri Jan 02 02:03:04 1970 PST - | Thu Jan 01 00:00:00 1970 PST | @ 10 days | Sun Jan 11 00:00:00 1970 PST - | Thu Jan 01 00:00:00 1970 PST | @ 3 mons | Wed Apr 01 00:00:00 1970 PST - | Thu Jan 01 00:00:00 1970 PST | @ 5 mons | Mon Jun 01 00:00:00 1970 PDT - | Thu Jan 01 00:00:00 1970 PST | @ 5 mons 12 hours | Mon Jun 01 12:00:00 1970 PDT - | Thu Jan 01 00:00:00 1970 PST | @ 6 years | Thu Jan 01 00:00:00 1976 PST - | Wed Feb 28 17:32:01 1996 PST | @ 14 secs ago | Wed Feb 28 17:31:47 1996 PST - | Wed Feb 28 17:32:01 1996 PST | @ 1 min | Wed Feb 28 17:33:01 1996 PST - | Wed Feb 28 17:32:01 1996 PST | @ 5 hours | Wed Feb 28 22:32:01 1996 PST - | Thu Feb 29 17:32:01 1996 PST | @ 14 secs ago | Thu Feb 29 17:31:47 1996 PST - | Thu Feb 29 17:32:01 1996 PST | @ 1 min | Thu Feb 29 17:33:01 1996 PST - | Wed Feb 28 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Feb 29 19:35:05 1996 PST - | Thu Feb 29 17:32:01 1996 PST | @ 5 hours | Thu Feb 29 22:32:01 1996 PST - | Fri Mar 01 17:32:01 1996 PST | @ 14 secs ago | Fri Mar 01 17:31:47 1996 PST - | Fri Mar 01 17:32:01 1996 PST | @ 1 min | Fri Mar 01 17:33:01 1996 PST - | Thu Feb 29 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Fri Mar 01 19:35:05 1996 PST - | Fri Mar 01 17:32:01 1996 PST | @ 5 hours | Fri Mar 01 22:32:01 1996 PST - | Fri Mar 01 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Sat Mar 02 19:35:05 1996 PST - | Wed Feb 28 17:32:01 1996 PST | @ 10 days | Sat Mar 09 17:32:01 1996 PST - | Thu Feb 29 17:32:01 1996 PST | @ 10 days | Sun Mar 10 17:32:01 1996 PST - | Fri Mar 01 17:32:01 1996 PST | @ 10 days | Mon Mar 11 17:32:01 1996 PST - | Wed Feb 28 17:32:01 1996 PST | @ 3 mons | Tue May 28 17:32:01 1996 PDT - | Thu Feb 29 17:32:01 1996 PST | @ 3 mons | Wed May 29 17:32:01 1996 PDT - | Fri Mar 01 17:32:01 1996 PST | @ 3 mons | Sat Jun 01 17:32:01 1996 PDT - | Wed Feb 28 17:32:01 1996 PST | @ 5 mons | Sun Jul 28 17:32:01 1996 PDT - | Wed Feb 28 17:32:01 1996 PST | @ 5 mons 12 hours | Mon Jul 29 05:32:01 1996 PDT - | Thu Feb 29 17:32:01 1996 PST | @ 5 mons | Mon Jul 29 17:32:01 1996 PDT - | Thu Feb 29 17:32:01 1996 PST | @ 5 mons 12 hours | Tue Jul 30 05:32:01 1996 PDT - | Fri Mar 01 17:32:01 1996 PST | @ 5 mons | Thu Aug 01 17:32:01 1996 PDT - | Fri Mar 01 17:32:01 1996 PST | @ 5 mons 12 hours | Fri Aug 02 05:32:01 1996 PDT - | Mon Dec 30 17:32:01 1996 PST | @ 14 secs ago | Mon Dec 30 17:31:47 1996 PST - | Mon Dec 30 17:32:01 1996 PST | @ 1 min | Mon Dec 30 17:33:01 1996 PST - | Mon Dec 30 17:32:01 1996 PST | @ 5 hours | Mon Dec 30 22:32:01 1996 PST - | Tue Dec 31 17:32:01 1996 PST | @ 14 secs ago | Tue Dec 31 17:31:47 1996 PST - | Tue Dec 31 17:32:01 1996 PST | @ 1 min | Tue Dec 31 17:33:01 1996 PST - | Mon Dec 30 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Dec 31 19:35:05 1996 PST - | Tue Dec 31 17:32:01 1996 PST | @ 5 hours | Tue Dec 31 22:32:01 1996 PST - | Tue Dec 31 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Wed Jan 01 19:35:05 1997 PST - | Mon Dec 30 17:32:01 1996 PST | @ 10 days | Thu Jan 09 17:32:01 1997 PST - | Tue Dec 31 17:32:01 1996 PST | @ 10 days | Fri Jan 10 17:32:01 1997 PST - | Mon Dec 30 17:32:01 1996 PST | @ 3 mons | Sun Mar 30 17:32:01 1997 PST - | Tue Dec 31 17:32:01 1996 PST | @ 3 mons | Mon Mar 31 17:32:01 1997 PST - | Mon Dec 30 17:32:01 1996 PST | @ 5 mons | Fri May 30 17:32:01 1997 PDT - | Mon Dec 30 17:32:01 1996 PST | @ 5 mons 12 hours | Sat May 31 05:32:01 1997 PDT - | Tue Dec 31 17:32:01 1996 PST | @ 5 mons | Sat May 31 17:32:01 1997 PDT - | Tue Dec 31 17:32:01 1996 PST | @ 5 mons 12 hours | Sun Jun 01 05:32:01 1997 PDT - | Fri Dec 31 17:32:01 1999 PST | @ 14 secs ago | Fri Dec 31 17:31:47 1999 PST - | Fri Dec 31 17:32:01 1999 PST | @ 1 min | Fri Dec 31 17:33:01 1999 PST - | Fri Dec 31 17:32:01 1999 PST | @ 5 hours | Fri Dec 31 22:32:01 1999 PST - | Sat Jan 01 17:32:01 2000 PST | @ 14 secs ago | Sat Jan 01 17:31:47 2000 PST - | Sat Jan 01 17:32:01 2000 PST | @ 1 min | Sat Jan 01 17:33:01 2000 PST - | Fri Dec 31 17:32:01 1999 PST | @ 1 day 2 hours 3 mins 4 secs | Sat Jan 01 19:35:05 2000 PST - | Sat Jan 01 17:32:01 2000 PST | @ 5 hours | Sat Jan 01 22:32:01 2000 PST - | Sat Jan 01 17:32:01 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Sun Jan 02 19:35:05 2000 PST - | Fri Dec 31 17:32:01 1999 PST | @ 10 days | Mon Jan 10 17:32:01 2000 PST - | Sat Jan 01 17:32:01 2000 PST | @ 10 days | Tue Jan 11 17:32:01 2000 PST - | Wed Mar 15 02:14:05 2000 PST | @ 14 secs ago | Wed Mar 15 02:13:51 2000 PST - | Wed Mar 15 02:14:05 2000 PST | @ 1 min | Wed Mar 15 02:15:05 2000 PST - | Wed Mar 15 03:14:04 2000 PST | @ 14 secs ago | Wed Mar 15 03:13:50 2000 PST - | Wed Mar 15 03:14:04 2000 PST | @ 1 min | Wed Mar 15 03:15:04 2000 PST - | Wed Mar 15 02:14:05 2000 PST | @ 5 hours | Wed Mar 15 07:14:05 2000 PST - | Wed Mar 15 08:14:01 2000 PST | @ 14 secs ago | Wed Mar 15 08:13:47 2000 PST - | Wed Mar 15 03:14:04 2000 PST | @ 5 hours | Wed Mar 15 08:14:04 2000 PST - | Wed Mar 15 08:14:01 2000 PST | @ 1 min | Wed Mar 15 08:15:01 2000 PST - | Wed Mar 15 12:14:03 2000 PST | @ 14 secs ago | Wed Mar 15 12:13:49 2000 PST - | Wed Mar 15 12:14:03 2000 PST | @ 1 min | Wed Mar 15 12:15:03 2000 PST - | Wed Mar 15 13:14:02 2000 PST | @ 14 secs ago | Wed Mar 15 13:13:48 2000 PST - | Wed Mar 15 08:14:01 2000 PST | @ 5 hours | Wed Mar 15 13:14:01 2000 PST - | Wed Mar 15 13:14:02 2000 PST | @ 1 min | Wed Mar 15 13:15:02 2000 PST - | Wed Mar 15 12:14:03 2000 PST | @ 5 hours | Wed Mar 15 17:14:03 2000 PST - | Wed Mar 15 13:14:02 2000 PST | @ 5 hours | Wed Mar 15 18:14:02 2000 PST - | Wed Mar 15 02:14:05 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Mar 16 04:17:09 2000 PST - | Wed Mar 15 03:14:04 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Mar 16 05:17:08 2000 PST - | Wed Mar 15 08:14:01 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Mar 16 10:17:05 2000 PST - | Wed Mar 15 12:14:03 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Mar 16 14:17:07 2000 PST - | Wed Mar 15 13:14:02 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Mar 16 15:17:06 2000 PST - | Wed Mar 15 02:14:05 2000 PST | @ 10 days | Sat Mar 25 02:14:05 2000 PST - | Wed Mar 15 03:14:04 2000 PST | @ 10 days | Sat Mar 25 03:14:04 2000 PST - | Wed Mar 15 08:14:01 2000 PST | @ 10 days | Sat Mar 25 08:14:01 2000 PST - | Wed Mar 15 12:14:03 2000 PST | @ 10 days | Sat Mar 25 12:14:03 2000 PST - | Wed Mar 15 13:14:02 2000 PST | @ 10 days | Sat Mar 25 13:14:02 2000 PST - | Fri Dec 31 17:32:01 1999 PST | @ 3 mons | Fri Mar 31 17:32:01 2000 PST - | Sat Jan 01 17:32:01 2000 PST | @ 3 mons | Sat Apr 01 17:32:01 2000 PST - | Fri Dec 31 17:32:01 1999 PST | @ 5 mons | Wed May 31 17:32:01 2000 PDT - | Fri Dec 31 17:32:01 1999 PST | @ 5 mons 12 hours | Thu Jun 01 05:32:01 2000 PDT - | Sat Jan 01 17:32:01 2000 PST | @ 5 mons | Thu Jun 01 17:32:01 2000 PDT - | Sat Jan 01 17:32:01 2000 PST | @ 5 mons 12 hours | Fri Jun 02 05:32:01 2000 PDT - | Wed Mar 15 02:14:05 2000 PST | @ 3 mons | Thu Jun 15 02:14:05 2000 PDT - | Wed Mar 15 03:14:04 2000 PST | @ 3 mons | Thu Jun 15 03:14:04 2000 PDT - | Wed Mar 15 08:14:01 2000 PST | @ 3 mons | Thu Jun 15 08:14:01 2000 PDT - | Wed Mar 15 12:14:03 2000 PST | @ 3 mons | Thu Jun 15 12:14:03 2000 PDT - | Wed Mar 15 13:14:02 2000 PST | @ 3 mons | Thu Jun 15 13:14:02 2000 PDT - | Wed Mar 15 02:14:05 2000 PST | @ 5 mons | Tue Aug 15 02:14:05 2000 PDT - | Wed Mar 15 03:14:04 2000 PST | @ 5 mons | Tue Aug 15 03:14:04 2000 PDT - | Wed Mar 15 08:14:01 2000 PST | @ 5 mons | Tue Aug 15 08:14:01 2000 PDT - | Wed Mar 15 12:14:03 2000 PST | @ 5 mons | Tue Aug 15 12:14:03 2000 PDT - | Wed Mar 15 13:14:02 2000 PST | @ 5 mons | Tue Aug 15 13:14:02 2000 PDT - | Wed Mar 15 02:14:05 2000 PST | @ 5 mons 12 hours | Tue Aug 15 14:14:05 2000 PDT - | Wed Mar 15 03:14:04 2000 PST | @ 5 mons 12 hours | Tue Aug 15 15:14:04 2000 PDT - | Wed Mar 15 08:14:01 2000 PST | @ 5 mons 12 hours | Tue Aug 15 20:14:01 2000 PDT - | Wed Mar 15 12:14:03 2000 PST | @ 5 mons 12 hours | Wed Aug 16 00:14:03 2000 PDT - | Wed Mar 15 13:14:02 2000 PST | @ 5 mons 12 hours | Wed Aug 16 01:14:02 2000 PDT - | Sun Dec 31 17:32:01 2000 PST | @ 14 secs ago | Sun Dec 31 17:31:47 2000 PST - | Sun Dec 31 17:32:01 2000 PST | @ 1 min | Sun Dec 31 17:33:01 2000 PST - | Sun Dec 31 17:32:01 2000 PST | @ 5 hours | Sun Dec 31 22:32:01 2000 PST - | Mon Jan 01 17:32:01 2001 PST | @ 14 secs ago | Mon Jan 01 17:31:47 2001 PST - | Mon Jan 01 17:32:01 2001 PST | @ 1 min | Mon Jan 01 17:33:01 2001 PST - | Sun Dec 31 17:32:01 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Mon Jan 01 19:35:05 2001 PST - | Mon Jan 01 17:32:01 2001 PST | @ 5 hours | Mon Jan 01 22:32:01 2001 PST - | Mon Jan 01 17:32:01 2001 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Jan 02 19:35:05 2001 PST - | Sun Dec 31 17:32:01 2000 PST | @ 10 days | Wed Jan 10 17:32:01 2001 PST - | Mon Jan 01 17:32:01 2001 PST | @ 10 days | Thu Jan 11 17:32:01 2001 PST - | Sun Dec 31 17:32:01 2000 PST | @ 3 mons | Sat Mar 31 17:32:01 2001 PST - | Mon Jan 01 17:32:01 2001 PST | @ 3 mons | Sun Apr 01 17:32:01 2001 PDT - | Sun Dec 31 17:32:01 2000 PST | @ 5 mons | Thu May 31 17:32:01 2001 PDT - | Sun Dec 31 17:32:01 2000 PST | @ 5 mons 12 hours | Fri Jun 01 05:32:01 2001 PDT - | Mon Jan 01 17:32:01 2001 PST | @ 5 mons | Fri Jun 01 17:32:01 2001 PDT - | Mon Jan 01 17:32:01 2001 PST | @ 5 mons 12 hours | Sat Jun 02 05:32:01 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 14 secs ago | Sat Sep 22 18:19:06 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 1 min | Sat Sep 22 18:20:20 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 5 hours | Sat Sep 22 23:19:20 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 1 day 2 hours 3 mins 4 secs | Sun Sep 23 20:22:24 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 10 days | Tue Oct 02 18:19:20 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 3 mons | Sat Dec 22 18:19:20 2001 PST - | Sat Sep 22 18:19:20 2001 PDT | @ 5 mons | Fri Feb 22 18:19:20 2002 PST - | Sat Sep 22 18:19:20 2001 PDT | @ 5 mons 12 hours | Sat Feb 23 06:19:20 2002 PST - | Wed Feb 28 17:32:01 1996 PST | @ 6 years | Thu Feb 28 17:32:01 2002 PST - | Thu Feb 29 17:32:01 1996 PST | @ 6 years | Thu Feb 28 17:32:01 2002 PST - | Fri Mar 01 17:32:01 1996 PST | @ 6 years | Fri Mar 01 17:32:01 2002 PST - | Mon Dec 30 17:32:01 1996 PST | @ 6 years | Mon Dec 30 17:32:01 2002 PST - | Tue Dec 31 17:32:01 1996 PST | @ 6 years | Tue Dec 31 17:32:01 2002 PST - | Thu Jan 01 00:00:00 1970 PST | @ 34 years | Thu Jan 01 00:00:00 2004 PST - | Fri Dec 31 17:32:01 1999 PST | @ 6 years | Sat Dec 31 17:32:01 2005 PST - | Sat Jan 01 17:32:01 2000 PST | @ 6 years | Sun Jan 01 17:32:01 2006 PST - | Wed Mar 15 02:14:05 2000 PST | @ 6 years | Wed Mar 15 02:14:05 2006 PST - | Wed Mar 15 03:14:04 2000 PST | @ 6 years | Wed Mar 15 03:14:04 2006 PST - | Wed Mar 15 08:14:01 2000 PST | @ 6 years | Wed Mar 15 08:14:01 2006 PST - | Wed Mar 15 12:14:03 2000 PST | @ 6 years | Wed Mar 15 12:14:03 2006 PST - | Wed Mar 15 13:14:02 2000 PST | @ 6 years | Wed Mar 15 13:14:02 2006 PST - | Sun Dec 31 17:32:01 2000 PST | @ 6 years | Sun Dec 31 17:32:01 2006 PST - | Mon Jan 01 17:32:01 2001 PST | @ 6 years | Mon Jan 01 17:32:01 2007 PST - | Sat Sep 22 18:19:20 2001 PDT | @ 6 years | Sat Sep 22 18:19:20 2007 PDT - | Wed Feb 28 17:32:01 1996 PST | @ 34 years | Thu Feb 28 17:32:01 2030 PST - | Thu Feb 29 17:32:01 1996 PST | @ 34 years | Thu Feb 28 17:32:01 2030 PST - | Fri Mar 01 17:32:01 1996 PST | @ 34 years | Fri Mar 01 17:32:01 2030 PST - | Mon Dec 30 17:32:01 1996 PST | @ 34 years | Mon Dec 30 17:32:01 2030 PST - | Tue Dec 31 17:32:01 1996 PST | @ 34 years | Tue Dec 31 17:32:01 2030 PST - | Fri Dec 31 17:32:01 1999 PST | @ 34 years | Sat Dec 31 17:32:01 2033 PST - | Sat Jan 01 17:32:01 2000 PST | @ 34 years | Sun Jan 01 17:32:01 2034 PST - | Wed Mar 15 02:14:05 2000 PST | @ 34 years | Wed Mar 15 02:14:05 2034 PST - | Wed Mar 15 03:14:04 2000 PST | @ 34 years | Wed Mar 15 03:14:04 2034 PST - | Wed Mar 15 08:14:01 2000 PST | @ 34 years | Wed Mar 15 08:14:01 2034 PST - | Wed Mar 15 12:14:03 2000 PST | @ 34 years | Wed Mar 15 12:14:03 2034 PST - | Wed Mar 15 13:14:02 2000 PST | @ 34 years | Wed Mar 15 13:14:02 2034 PST - | Sun Dec 31 17:32:01 2000 PST | @ 34 years | Sun Dec 31 17:32:01 2034 PST - | Mon Jan 01 17:32:01 2001 PST | @ 34 years | Mon Jan 01 17:32:01 2035 PST - | Sat Sep 22 18:19:20 2001 PDT | @ 34 years | Sat Sep 22 18:19:20 2035 PDT -(160 rows) - -SELECT '' AS "160", d.f1 AS "timestamp", t.f1 AS "interval", d.f1 - t.f1 AS minus - FROM TEMP_TIMESTAMP d, INTERVAL_TBL t - WHERE isfinite(d.f1) - ORDER BY minus, "timestamp", "interval"; - 160 | timestamp | interval | minus ------+------------------------------+-------------------------------+------------------------------ - | Thu Jan 01 00:00:00 1970 PST | @ 34 years | Wed Jan 01 00:00:00 1936 PST - | Wed Feb 28 17:32:01 1996 PST | @ 34 years | Wed Feb 28 17:32:01 1962 PST - | Thu Feb 29 17:32:01 1996 PST | @ 34 years | Wed Feb 28 17:32:01 1962 PST - | Fri Mar 01 17:32:01 1996 PST | @ 34 years | Thu Mar 01 17:32:01 1962 PST - | Mon Dec 30 17:32:01 1996 PST | @ 34 years | Sun Dec 30 17:32:01 1962 PST - | Tue Dec 31 17:32:01 1996 PST | @ 34 years | Mon Dec 31 17:32:01 1962 PST - | Thu Jan 01 00:00:00 1970 PST | @ 6 years | Wed Jan 01 00:00:00 1964 PST - | Fri Dec 31 17:32:01 1999 PST | @ 34 years | Fri Dec 31 17:32:01 1965 PST - | Sat Jan 01 17:32:01 2000 PST | @ 34 years | Sat Jan 01 17:32:01 1966 PST - | Wed Mar 15 02:14:05 2000 PST | @ 34 years | Tue Mar 15 02:14:05 1966 PST - | Wed Mar 15 03:14:04 2000 PST | @ 34 years | Tue Mar 15 03:14:04 1966 PST - | Wed Mar 15 08:14:01 2000 PST | @ 34 years | Tue Mar 15 08:14:01 1966 PST - | Wed Mar 15 12:14:03 2000 PST | @ 34 years | Tue Mar 15 12:14:03 1966 PST - | Wed Mar 15 13:14:02 2000 PST | @ 34 years | Tue Mar 15 13:14:02 1966 PST - | Sun Dec 31 17:32:01 2000 PST | @ 34 years | Sat Dec 31 17:32:01 1966 PST - | Mon Jan 01 17:32:01 2001 PST | @ 34 years | Sun Jan 01 17:32:01 1967 PST - | Sat Sep 22 18:19:20 2001 PDT | @ 34 years | Fri Sep 22 18:19:20 1967 PDT - | Thu Jan 01 00:00:00 1970 PST | @ 5 mons 12 hours | Thu Jul 31 12:00:00 1969 PDT - | Thu Jan 01 00:00:00 1970 PST | @ 5 mons | Fri Aug 01 00:00:00 1969 PDT - | Thu Jan 01 00:00:00 1970 PST | @ 3 mons | Wed Oct 01 00:00:00 1969 PDT - | Thu Jan 01 00:00:00 1970 PST | @ 10 days | Mon Dec 22 00:00:00 1969 PST - | Thu Jan 01 00:00:00 1970 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Dec 30 21:56:56 1969 PST - | Thu Jan 01 00:00:00 1970 PST | @ 5 hours | Wed Dec 31 19:00:00 1969 PST - | Thu Jan 01 00:00:00 1970 PST | @ 1 min | Wed Dec 31 23:59:00 1969 PST - | Thu Jan 01 00:00:00 1970 PST | @ 14 secs ago | Thu Jan 01 00:00:14 1970 PST - | Wed Feb 28 17:32:01 1996 PST | @ 6 years | Wed Feb 28 17:32:01 1990 PST - | Thu Feb 29 17:32:01 1996 PST | @ 6 years | Wed Feb 28 17:32:01 1990 PST - | Fri Mar 01 17:32:01 1996 PST | @ 6 years | Thu Mar 01 17:32:01 1990 PST - | Mon Dec 30 17:32:01 1996 PST | @ 6 years | Sun Dec 30 17:32:01 1990 PST - | Tue Dec 31 17:32:01 1996 PST | @ 6 years | Mon Dec 31 17:32:01 1990 PST - | Fri Dec 31 17:32:01 1999 PST | @ 6 years | Fri Dec 31 17:32:01 1993 PST - | Sat Jan 01 17:32:01 2000 PST | @ 6 years | Sat Jan 01 17:32:01 1994 PST - | Wed Mar 15 02:14:05 2000 PST | @ 6 years | Tue Mar 15 02:14:05 1994 PST - | Wed Mar 15 03:14:04 2000 PST | @ 6 years | Tue Mar 15 03:14:04 1994 PST - | Wed Mar 15 08:14:01 2000 PST | @ 6 years | Tue Mar 15 08:14:01 1994 PST - | Wed Mar 15 12:14:03 2000 PST | @ 6 years | Tue Mar 15 12:14:03 1994 PST - | Wed Mar 15 13:14:02 2000 PST | @ 6 years | Tue Mar 15 13:14:02 1994 PST - | Sun Dec 31 17:32:01 2000 PST | @ 6 years | Sat Dec 31 17:32:01 1994 PST - | Mon Jan 01 17:32:01 2001 PST | @ 6 years | Sun Jan 01 17:32:01 1995 PST - | Sat Sep 22 18:19:20 2001 PDT | @ 6 years | Fri Sep 22 18:19:20 1995 PDT - | Wed Feb 28 17:32:01 1996 PST | @ 5 mons 12 hours | Thu Sep 28 05:32:01 1995 PDT - | Wed Feb 28 17:32:01 1996 PST | @ 5 mons | Thu Sep 28 17:32:01 1995 PDT - | Thu Feb 29 17:32:01 1996 PST | @ 5 mons 12 hours | Fri Sep 29 05:32:01 1995 PDT - | Thu Feb 29 17:32:01 1996 PST | @ 5 mons | Fri Sep 29 17:32:01 1995 PDT - | Fri Mar 01 17:32:01 1996 PST | @ 5 mons 12 hours | Sun Oct 01 05:32:01 1995 PDT - | Fri Mar 01 17:32:01 1996 PST | @ 5 mons | Sun Oct 01 17:32:01 1995 PDT - | Wed Feb 28 17:32:01 1996 PST | @ 3 mons | Tue Nov 28 17:32:01 1995 PST - | Thu Feb 29 17:32:01 1996 PST | @ 3 mons | Wed Nov 29 17:32:01 1995 PST - | Fri Mar 01 17:32:01 1996 PST | @ 3 mons | Fri Dec 01 17:32:01 1995 PST - | Wed Feb 28 17:32:01 1996 PST | @ 10 days | Sun Feb 18 17:32:01 1996 PST - | Thu Feb 29 17:32:01 1996 PST | @ 10 days | Mon Feb 19 17:32:01 1996 PST - | Fri Mar 01 17:32:01 1996 PST | @ 10 days | Tue Feb 20 17:32:01 1996 PST - | Wed Feb 28 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Feb 27 15:28:57 1996 PST - | Wed Feb 28 17:32:01 1996 PST | @ 5 hours | Wed Feb 28 12:32:01 1996 PST - | Thu Feb 29 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Wed Feb 28 15:28:57 1996 PST - | Wed Feb 28 17:32:01 1996 PST | @ 1 min | Wed Feb 28 17:31:01 1996 PST - | Wed Feb 28 17:32:01 1996 PST | @ 14 secs ago | Wed Feb 28 17:32:15 1996 PST - | Thu Feb 29 17:32:01 1996 PST | @ 5 hours | Thu Feb 29 12:32:01 1996 PST - | Fri Mar 01 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Feb 29 15:28:57 1996 PST - | Thu Feb 29 17:32:01 1996 PST | @ 1 min | Thu Feb 29 17:31:01 1996 PST - | Thu Feb 29 17:32:01 1996 PST | @ 14 secs ago | Thu Feb 29 17:32:15 1996 PST - | Fri Mar 01 17:32:01 1996 PST | @ 5 hours | Fri Mar 01 12:32:01 1996 PST - | Fri Mar 01 17:32:01 1996 PST | @ 1 min | Fri Mar 01 17:31:01 1996 PST - | Fri Mar 01 17:32:01 1996 PST | @ 14 secs ago | Fri Mar 01 17:32:15 1996 PST - | Mon Dec 30 17:32:01 1996 PST | @ 5 mons 12 hours | Tue Jul 30 05:32:01 1996 PDT - | Mon Dec 30 17:32:01 1996 PST | @ 5 mons | Tue Jul 30 17:32:01 1996 PDT - | Tue Dec 31 17:32:01 1996 PST | @ 5 mons 12 hours | Wed Jul 31 05:32:01 1996 PDT - | Tue Dec 31 17:32:01 1996 PST | @ 5 mons | Wed Jul 31 17:32:01 1996 PDT - | Mon Dec 30 17:32:01 1996 PST | @ 3 mons | Mon Sep 30 17:32:01 1996 PDT - | Tue Dec 31 17:32:01 1996 PST | @ 3 mons | Mon Sep 30 17:32:01 1996 PDT - | Mon Dec 30 17:32:01 1996 PST | @ 10 days | Fri Dec 20 17:32:01 1996 PST - | Tue Dec 31 17:32:01 1996 PST | @ 10 days | Sat Dec 21 17:32:01 1996 PST - | Mon Dec 30 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Sun Dec 29 15:28:57 1996 PST - | Mon Dec 30 17:32:01 1996 PST | @ 5 hours | Mon Dec 30 12:32:01 1996 PST - | Tue Dec 31 17:32:01 1996 PST | @ 1 day 2 hours 3 mins 4 secs | Mon Dec 30 15:28:57 1996 PST - | Mon Dec 30 17:32:01 1996 PST | @ 1 min | Mon Dec 30 17:31:01 1996 PST - | Mon Dec 30 17:32:01 1996 PST | @ 14 secs ago | Mon Dec 30 17:32:15 1996 PST - | Tue Dec 31 17:32:01 1996 PST | @ 5 hours | Tue Dec 31 12:32:01 1996 PST - | Tue Dec 31 17:32:01 1996 PST | @ 1 min | Tue Dec 31 17:31:01 1996 PST - | Tue Dec 31 17:32:01 1996 PST | @ 14 secs ago | Tue Dec 31 17:32:15 1996 PST - | Fri Dec 31 17:32:01 1999 PST | @ 5 mons 12 hours | Sat Jul 31 05:32:01 1999 PDT - | Fri Dec 31 17:32:01 1999 PST | @ 5 mons | Sat Jul 31 17:32:01 1999 PDT - | Sat Jan 01 17:32:01 2000 PST | @ 5 mons 12 hours | Sun Aug 01 05:32:01 1999 PDT - | Sat Jan 01 17:32:01 2000 PST | @ 5 mons | Sun Aug 01 17:32:01 1999 PDT - | Fri Dec 31 17:32:01 1999 PST | @ 3 mons | Thu Sep 30 17:32:01 1999 PDT - | Sat Jan 01 17:32:01 2000 PST | @ 3 mons | Fri Oct 01 17:32:01 1999 PDT - | Wed Mar 15 02:14:05 2000 PST | @ 5 mons 12 hours | Thu Oct 14 14:14:05 1999 PDT - | Wed Mar 15 03:14:04 2000 PST | @ 5 mons 12 hours | Thu Oct 14 15:14:04 1999 PDT - | Wed Mar 15 08:14:01 2000 PST | @ 5 mons 12 hours | Thu Oct 14 20:14:01 1999 PDT - | Wed Mar 15 12:14:03 2000 PST | @ 5 mons 12 hours | Fri Oct 15 00:14:03 1999 PDT - | Wed Mar 15 13:14:02 2000 PST | @ 5 mons 12 hours | Fri Oct 15 01:14:02 1999 PDT - | Wed Mar 15 02:14:05 2000 PST | @ 5 mons | Fri Oct 15 02:14:05 1999 PDT - | Wed Mar 15 03:14:04 2000 PST | @ 5 mons | Fri Oct 15 03:14:04 1999 PDT - | Wed Mar 15 08:14:01 2000 PST | @ 5 mons | Fri Oct 15 08:14:01 1999 PDT - | Wed Mar 15 12:14:03 2000 PST | @ 5 mons | Fri Oct 15 12:14:03 1999 PDT - | Wed Mar 15 13:14:02 2000 PST | @ 5 mons | Fri Oct 15 13:14:02 1999 PDT - | Wed Mar 15 02:14:05 2000 PST | @ 3 mons | Wed Dec 15 02:14:05 1999 PST - | Wed Mar 15 03:14:04 2000 PST | @ 3 mons | Wed Dec 15 03:14:04 1999 PST - | Wed Mar 15 08:14:01 2000 PST | @ 3 mons | Wed Dec 15 08:14:01 1999 PST - | Wed Mar 15 12:14:03 2000 PST | @ 3 mons | Wed Dec 15 12:14:03 1999 PST - | Wed Mar 15 13:14:02 2000 PST | @ 3 mons | Wed Dec 15 13:14:02 1999 PST - | Fri Dec 31 17:32:01 1999 PST | @ 10 days | Tue Dec 21 17:32:01 1999 PST - | Sat Jan 01 17:32:01 2000 PST | @ 10 days | Wed Dec 22 17:32:01 1999 PST - | Fri Dec 31 17:32:01 1999 PST | @ 1 day 2 hours 3 mins 4 secs | Thu Dec 30 15:28:57 1999 PST - | Fri Dec 31 17:32:01 1999 PST | @ 5 hours | Fri Dec 31 12:32:01 1999 PST - | Sat Jan 01 17:32:01 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Fri Dec 31 15:28:57 1999 PST - | Fri Dec 31 17:32:01 1999 PST | @ 1 min | Fri Dec 31 17:31:01 1999 PST - | Fri Dec 31 17:32:01 1999 PST | @ 14 secs ago | Fri Dec 31 17:32:15 1999 PST - | Sat Jan 01 17:32:01 2000 PST | @ 5 hours | Sat Jan 01 12:32:01 2000 PST - | Sat Jan 01 17:32:01 2000 PST | @ 1 min | Sat Jan 01 17:31:01 2000 PST - | Sat Jan 01 17:32:01 2000 PST | @ 14 secs ago | Sat Jan 01 17:32:15 2000 PST - | Wed Mar 15 02:14:05 2000 PST | @ 10 days | Sun Mar 05 02:14:05 2000 PST - | Wed Mar 15 03:14:04 2000 PST | @ 10 days | Sun Mar 05 03:14:04 2000 PST - | Wed Mar 15 08:14:01 2000 PST | @ 10 days | Sun Mar 05 08:14:01 2000 PST - | Wed Mar 15 12:14:03 2000 PST | @ 10 days | Sun Mar 05 12:14:03 2000 PST - | Wed Mar 15 13:14:02 2000 PST | @ 10 days | Sun Mar 05 13:14:02 2000 PST - | Wed Mar 15 02:14:05 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Mar 14 00:11:01 2000 PST - | Wed Mar 15 03:14:04 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Mar 14 01:11:00 2000 PST - | Wed Mar 15 08:14:01 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Mar 14 06:10:57 2000 PST - | Wed Mar 15 12:14:03 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Mar 14 10:10:59 2000 PST - | Wed Mar 15 13:14:02 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Tue Mar 14 11:10:58 2000 PST - | Wed Mar 15 02:14:05 2000 PST | @ 5 hours | Tue Mar 14 21:14:05 2000 PST - | Wed Mar 15 03:14:04 2000 PST | @ 5 hours | Tue Mar 14 22:14:04 2000 PST - | Wed Mar 15 02:14:05 2000 PST | @ 1 min | Wed Mar 15 02:13:05 2000 PST - | Wed Mar 15 02:14:05 2000 PST | @ 14 secs ago | Wed Mar 15 02:14:19 2000 PST - | Wed Mar 15 03:14:04 2000 PST | @ 1 min | Wed Mar 15 03:13:04 2000 PST - | Wed Mar 15 08:14:01 2000 PST | @ 5 hours | Wed Mar 15 03:14:01 2000 PST - | Wed Mar 15 03:14:04 2000 PST | @ 14 secs ago | Wed Mar 15 03:14:18 2000 PST - | Wed Mar 15 12:14:03 2000 PST | @ 5 hours | Wed Mar 15 07:14:03 2000 PST - | Wed Mar 15 08:14:01 2000 PST | @ 1 min | Wed Mar 15 08:13:01 2000 PST - | Wed Mar 15 13:14:02 2000 PST | @ 5 hours | Wed Mar 15 08:14:02 2000 PST - | Wed Mar 15 08:14:01 2000 PST | @ 14 secs ago | Wed Mar 15 08:14:15 2000 PST - | Wed Mar 15 12:14:03 2000 PST | @ 1 min | Wed Mar 15 12:13:03 2000 PST - | Wed Mar 15 12:14:03 2000 PST | @ 14 secs ago | Wed Mar 15 12:14:17 2000 PST - | Wed Mar 15 13:14:02 2000 PST | @ 1 min | Wed Mar 15 13:13:02 2000 PST - | Wed Mar 15 13:14:02 2000 PST | @ 14 secs ago | Wed Mar 15 13:14:16 2000 PST - | Sun Dec 31 17:32:01 2000 PST | @ 5 mons 12 hours | Mon Jul 31 05:32:01 2000 PDT - | Sun Dec 31 17:32:01 2000 PST | @ 5 mons | Mon Jul 31 17:32:01 2000 PDT - | Mon Jan 01 17:32:01 2001 PST | @ 5 mons 12 hours | Tue Aug 01 05:32:01 2000 PDT - | Mon Jan 01 17:32:01 2001 PST | @ 5 mons | Tue Aug 01 17:32:01 2000 PDT - | Sun Dec 31 17:32:01 2000 PST | @ 3 mons | Sat Sep 30 17:32:01 2000 PDT - | Mon Jan 01 17:32:01 2001 PST | @ 3 mons | Sun Oct 01 17:32:01 2000 PDT - | Sun Dec 31 17:32:01 2000 PST | @ 10 days | Thu Dec 21 17:32:01 2000 PST - | Mon Jan 01 17:32:01 2001 PST | @ 10 days | Fri Dec 22 17:32:01 2000 PST - | Sun Dec 31 17:32:01 2000 PST | @ 1 day 2 hours 3 mins 4 secs | Sat Dec 30 15:28:57 2000 PST - | Sun Dec 31 17:32:01 2000 PST | @ 5 hours | Sun Dec 31 12:32:01 2000 PST - | Mon Jan 01 17:32:01 2001 PST | @ 1 day 2 hours 3 mins 4 secs | Sun Dec 31 15:28:57 2000 PST - | Sun Dec 31 17:32:01 2000 PST | @ 1 min | Sun Dec 31 17:31:01 2000 PST - | Sun Dec 31 17:32:01 2000 PST | @ 14 secs ago | Sun Dec 31 17:32:15 2000 PST - | Mon Jan 01 17:32:01 2001 PST | @ 5 hours | Mon Jan 01 12:32:01 2001 PST - | Mon Jan 01 17:32:01 2001 PST | @ 1 min | Mon Jan 01 17:31:01 2001 PST - | Mon Jan 01 17:32:01 2001 PST | @ 14 secs ago | Mon Jan 01 17:32:15 2001 PST - | Sat Sep 22 18:19:20 2001 PDT | @ 5 mons 12 hours | Sun Apr 22 06:19:20 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 5 mons | Sun Apr 22 18:19:20 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 3 mons | Fri Jun 22 18:19:20 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 10 days | Wed Sep 12 18:19:20 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 1 day 2 hours 3 mins 4 secs | Fri Sep 21 16:16:16 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 5 hours | Sat Sep 22 13:19:20 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 1 min | Sat Sep 22 18:18:20 2001 PDT - | Sat Sep 22 18:19:20 2001 PDT | @ 14 secs ago | Sat Sep 22 18:19:34 2001 PDT -(160 rows) - -SELECT '' AS "16", d.f1 AS "timestamp", - timestamp with time zone '1980-01-06 00:00 GMT' AS gpstime_zero, - d.f1 - timestamp with time zone '1980-01-06 00:00 GMT' AS difference - FROM TEMP_TIMESTAMP d - ORDER BY difference; - 16 | timestamp | gpstime_zero | difference -----+------------------------------+------------------------------+------------------------------------- - | Thu Jan 01 00:00:00 1970 PST | Sat Jan 05 16:00:00 1980 PST | @ 3656 days 16 hours ago - | Wed Feb 28 17:32:01 1996 PST | Sat Jan 05 16:00:00 1980 PST | @ 5898 days 1 hour 32 mins 1 sec - | Thu Feb 29 17:32:01 1996 PST | Sat Jan 05 16:00:00 1980 PST | @ 5899 days 1 hour 32 mins 1 sec - | Fri Mar 01 17:32:01 1996 PST | Sat Jan 05 16:00:00 1980 PST | @ 5900 days 1 hour 32 mins 1 sec - | Mon Dec 30 17:32:01 1996 PST | Sat Jan 05 16:00:00 1980 PST | @ 6204 days 1 hour 32 mins 1 sec - | Tue Dec 31 17:32:01 1996 PST | Sat Jan 05 16:00:00 1980 PST | @ 6205 days 1 hour 32 mins 1 sec - | Fri Dec 31 17:32:01 1999 PST | Sat Jan 05 16:00:00 1980 PST | @ 7300 days 1 hour 32 mins 1 sec - | Sat Jan 01 17:32:01 2000 PST | Sat Jan 05 16:00:00 1980 PST | @ 7301 days 1 hour 32 mins 1 sec - | Wed Mar 15 02:14:05 2000 PST | Sat Jan 05 16:00:00 1980 PST | @ 7374 days 10 hours 14 mins 5 secs - | Wed Mar 15 03:14:04 2000 PST | Sat Jan 05 16:00:00 1980 PST | @ 7374 days 11 hours 14 mins 4 secs - | Wed Mar 15 08:14:01 2000 PST | Sat Jan 05 16:00:00 1980 PST | @ 7374 days 16 hours 14 mins 1 sec - | Wed Mar 15 12:14:03 2000 PST | Sat Jan 05 16:00:00 1980 PST | @ 7374 days 20 hours 14 mins 3 secs - | Wed Mar 15 13:14:02 2000 PST | Sat Jan 05 16:00:00 1980 PST | @ 7374 days 21 hours 14 mins 2 secs - | Sun Dec 31 17:32:01 2000 PST | Sat Jan 05 16:00:00 1980 PST | @ 7666 days 1 hour 32 mins 1 sec - | Mon Jan 01 17:32:01 2001 PST | Sat Jan 05 16:00:00 1980 PST | @ 7667 days 1 hour 32 mins 1 sec - | Sat Sep 22 18:19:20 2001 PDT | Sat Jan 05 16:00:00 1980 PST | @ 7931 days 1 hour 19 mins 20 secs -(16 rows) - -SELECT '' AS "226", d1.f1 AS timestamp1, d2.f1 AS timestamp2, d1.f1 - d2.f1 AS difference - FROM TEMP_TIMESTAMP d1, TEMP_TIMESTAMP d2 - ORDER BY timestamp1, timestamp2, difference; - 226 | timestamp1 | timestamp2 | difference ------+------------------------------+------------------------------+------------------------------------------- - | Thu Jan 01 00:00:00 1970 PST | Thu Jan 01 00:00:00 1970 PST | @ 0 - | Thu Jan 01 00:00:00 1970 PST | Wed Feb 28 17:32:01 1996 PST | @ 9554 days 17 hours 32 mins 1 sec ago - | Thu Jan 01 00:00:00 1970 PST | Thu Feb 29 17:32:01 1996 PST | @ 9555 days 17 hours 32 mins 1 sec ago - | Thu Jan 01 00:00:00 1970 PST | Fri Mar 01 17:32:01 1996 PST | @ 9556 days 17 hours 32 mins 1 sec ago - | Thu Jan 01 00:00:00 1970 PST | Mon Dec 30 17:32:01 1996 PST | @ 9860 days 17 hours 32 mins 1 sec ago - | Thu Jan 01 00:00:00 1970 PST | Tue Dec 31 17:32:01 1996 PST | @ 9861 days 17 hours 32 mins 1 sec ago - | Thu Jan 01 00:00:00 1970 PST | Fri Dec 31 17:32:01 1999 PST | @ 10956 days 17 hours 32 mins 1 sec ago - | Thu Jan 01 00:00:00 1970 PST | Sat Jan 01 17:32:01 2000 PST | @ 10957 days 17 hours 32 mins 1 sec ago - | Thu Jan 01 00:00:00 1970 PST | Wed Mar 15 02:14:05 2000 PST | @ 11031 days 2 hours 14 mins 5 secs ago - | Thu Jan 01 00:00:00 1970 PST | Wed Mar 15 03:14:04 2000 PST | @ 11031 days 3 hours 14 mins 4 secs ago - | Thu Jan 01 00:00:00 1970 PST | Wed Mar 15 08:14:01 2000 PST | @ 11031 days 8 hours 14 mins 1 sec ago - | Thu Jan 01 00:00:00 1970 PST | Wed Mar 15 12:14:03 2000 PST | @ 11031 days 12 hours 14 mins 3 secs ago - | Thu Jan 01 00:00:00 1970 PST | Wed Mar 15 13:14:02 2000 PST | @ 11031 days 13 hours 14 mins 2 secs ago - | Thu Jan 01 00:00:00 1970 PST | Sun Dec 31 17:32:01 2000 PST | @ 11322 days 17 hours 32 mins 1 sec ago - | Thu Jan 01 00:00:00 1970 PST | Mon Jan 01 17:32:01 2001 PST | @ 11323 days 17 hours 32 mins 1 sec ago - | Thu Jan 01 00:00:00 1970 PST | Sat Sep 22 18:19:20 2001 PDT | @ 11587 days 17 hours 19 mins 20 secs ago - | Wed Feb 28 17:32:01 1996 PST | Thu Jan 01 00:00:00 1970 PST | @ 9554 days 17 hours 32 mins 1 sec - | Wed Feb 28 17:32:01 1996 PST | Wed Feb 28 17:32:01 1996 PST | @ 0 - | Wed Feb 28 17:32:01 1996 PST | Thu Feb 29 17:32:01 1996 PST | @ 1 day ago - | Wed Feb 28 17:32:01 1996 PST | Fri Mar 01 17:32:01 1996 PST | @ 2 days ago - | Wed Feb 28 17:32:01 1996 PST | Mon Dec 30 17:32:01 1996 PST | @ 306 days ago - | Wed Feb 28 17:32:01 1996 PST | Tue Dec 31 17:32:01 1996 PST | @ 307 days ago - | Wed Feb 28 17:32:01 1996 PST | Fri Dec 31 17:32:01 1999 PST | @ 1402 days ago - | Wed Feb 28 17:32:01 1996 PST | Sat Jan 01 17:32:01 2000 PST | @ 1403 days ago - | Wed Feb 28 17:32:01 1996 PST | Wed Mar 15 02:14:05 2000 PST | @ 1476 days 8 hours 42 mins 4 secs ago - | Wed Feb 28 17:32:01 1996 PST | Wed Mar 15 03:14:04 2000 PST | @ 1476 days 9 hours 42 mins 3 secs ago - | Wed Feb 28 17:32:01 1996 PST | Wed Mar 15 08:14:01 2000 PST | @ 1476 days 14 hours 42 mins ago - | Wed Feb 28 17:32:01 1996 PST | Wed Mar 15 12:14:03 2000 PST | @ 1476 days 18 hours 42 mins 2 secs ago - | Wed Feb 28 17:32:01 1996 PST | Wed Mar 15 13:14:02 2000 PST | @ 1476 days 19 hours 42 mins 1 sec ago - | Wed Feb 28 17:32:01 1996 PST | Sun Dec 31 17:32:01 2000 PST | @ 1768 days ago - | Wed Feb 28 17:32:01 1996 PST | Mon Jan 01 17:32:01 2001 PST | @ 1769 days ago - | Wed Feb 28 17:32:01 1996 PST | Sat Sep 22 18:19:20 2001 PDT | @ 2032 days 23 hours 47 mins 19 secs ago - | Thu Feb 29 17:32:01 1996 PST | Thu Jan 01 00:00:00 1970 PST | @ 9555 days 17 hours 32 mins 1 sec - | Thu Feb 29 17:32:01 1996 PST | Wed Feb 28 17:32:01 1996 PST | @ 1 day - | Thu Feb 29 17:32:01 1996 PST | Thu Feb 29 17:32:01 1996 PST | @ 0 - | Thu Feb 29 17:32:01 1996 PST | Fri Mar 01 17:32:01 1996 PST | @ 1 day ago - | Thu Feb 29 17:32:01 1996 PST | Mon Dec 30 17:32:01 1996 PST | @ 305 days ago - | Thu Feb 29 17:32:01 1996 PST | Tue Dec 31 17:32:01 1996 PST | @ 306 days ago - | Thu Feb 29 17:32:01 1996 PST | Fri Dec 31 17:32:01 1999 PST | @ 1401 days ago - | Thu Feb 29 17:32:01 1996 PST | Sat Jan 01 17:32:01 2000 PST | @ 1402 days ago - | Thu Feb 29 17:32:01 1996 PST | Wed Mar 15 02:14:05 2000 PST | @ 1475 days 8 hours 42 mins 4 secs ago - | Thu Feb 29 17:32:01 1996 PST | Wed Mar 15 03:14:04 2000 PST | @ 1475 days 9 hours 42 mins 3 secs ago - | Thu Feb 29 17:32:01 1996 PST | Wed Mar 15 08:14:01 2000 PST | @ 1475 days 14 hours 42 mins ago - | Thu Feb 29 17:32:01 1996 PST | Wed Mar 15 12:14:03 2000 PST | @ 1475 days 18 hours 42 mins 2 secs ago - | Thu Feb 29 17:32:01 1996 PST | Wed Mar 15 13:14:02 2000 PST | @ 1475 days 19 hours 42 mins 1 sec ago - | Thu Feb 29 17:32:01 1996 PST | Sun Dec 31 17:32:01 2000 PST | @ 1767 days ago - | Thu Feb 29 17:32:01 1996 PST | Mon Jan 01 17:32:01 2001 PST | @ 1768 days ago - | Thu Feb 29 17:32:01 1996 PST | Sat Sep 22 18:19:20 2001 PDT | @ 2031 days 23 hours 47 mins 19 secs ago - | Fri Mar 01 17:32:01 1996 PST | Thu Jan 01 00:00:00 1970 PST | @ 9556 days 17 hours 32 mins 1 sec - | Fri Mar 01 17:32:01 1996 PST | Wed Feb 28 17:32:01 1996 PST | @ 2 days - | Fri Mar 01 17:32:01 1996 PST | Thu Feb 29 17:32:01 1996 PST | @ 1 day - | Fri Mar 01 17:32:01 1996 PST | Fri Mar 01 17:32:01 1996 PST | @ 0 - | Fri Mar 01 17:32:01 1996 PST | Mon Dec 30 17:32:01 1996 PST | @ 304 days ago - | Fri Mar 01 17:32:01 1996 PST | Tue Dec 31 17:32:01 1996 PST | @ 305 days ago - | Fri Mar 01 17:32:01 1996 PST | Fri Dec 31 17:32:01 1999 PST | @ 1400 days ago - | Fri Mar 01 17:32:01 1996 PST | Sat Jan 01 17:32:01 2000 PST | @ 1401 days ago - | Fri Mar 01 17:32:01 1996 PST | Wed Mar 15 02:14:05 2000 PST | @ 1474 days 8 hours 42 mins 4 secs ago - | Fri Mar 01 17:32:01 1996 PST | Wed Mar 15 03:14:04 2000 PST | @ 1474 days 9 hours 42 mins 3 secs ago - | Fri Mar 01 17:32:01 1996 PST | Wed Mar 15 08:14:01 2000 PST | @ 1474 days 14 hours 42 mins ago - | Fri Mar 01 17:32:01 1996 PST | Wed Mar 15 12:14:03 2000 PST | @ 1474 days 18 hours 42 mins 2 secs ago - | Fri Mar 01 17:32:01 1996 PST | Wed Mar 15 13:14:02 2000 PST | @ 1474 days 19 hours 42 mins 1 sec ago - | Fri Mar 01 17:32:01 1996 PST | Sun Dec 31 17:32:01 2000 PST | @ 1766 days ago - | Fri Mar 01 17:32:01 1996 PST | Mon Jan 01 17:32:01 2001 PST | @ 1767 days ago - | Fri Mar 01 17:32:01 1996 PST | Sat Sep 22 18:19:20 2001 PDT | @ 2030 days 23 hours 47 mins 19 secs ago - | Mon Dec 30 17:32:01 1996 PST | Thu Jan 01 00:00:00 1970 PST | @ 9860 days 17 hours 32 mins 1 sec - | Mon Dec 30 17:32:01 1996 PST | Wed Feb 28 17:32:01 1996 PST | @ 306 days - | Mon Dec 30 17:32:01 1996 PST | Thu Feb 29 17:32:01 1996 PST | @ 305 days - | Mon Dec 30 17:32:01 1996 PST | Fri Mar 01 17:32:01 1996 PST | @ 304 days - | Mon Dec 30 17:32:01 1996 PST | Mon Dec 30 17:32:01 1996 PST | @ 0 - | Mon Dec 30 17:32:01 1996 PST | Tue Dec 31 17:32:01 1996 PST | @ 1 day ago - | Mon Dec 30 17:32:01 1996 PST | Fri Dec 31 17:32:01 1999 PST | @ 1096 days ago - | Mon Dec 30 17:32:01 1996 PST | Sat Jan 01 17:32:01 2000 PST | @ 1097 days ago - | Mon Dec 30 17:32:01 1996 PST | Wed Mar 15 02:14:05 2000 PST | @ 1170 days 8 hours 42 mins 4 secs ago - | Mon Dec 30 17:32:01 1996 PST | Wed Mar 15 03:14:04 2000 PST | @ 1170 days 9 hours 42 mins 3 secs ago - | Mon Dec 30 17:32:01 1996 PST | Wed Mar 15 08:14:01 2000 PST | @ 1170 days 14 hours 42 mins ago - | Mon Dec 30 17:32:01 1996 PST | Wed Mar 15 12:14:03 2000 PST | @ 1170 days 18 hours 42 mins 2 secs ago - | Mon Dec 30 17:32:01 1996 PST | Wed Mar 15 13:14:02 2000 PST | @ 1170 days 19 hours 42 mins 1 sec ago - | Mon Dec 30 17:32:01 1996 PST | Sun Dec 31 17:32:01 2000 PST | @ 1462 days ago - | Mon Dec 30 17:32:01 1996 PST | Mon Jan 01 17:32:01 2001 PST | @ 1463 days ago - | Mon Dec 30 17:32:01 1996 PST | Sat Sep 22 18:19:20 2001 PDT | @ 1726 days 23 hours 47 mins 19 secs ago - | Tue Dec 31 17:32:01 1996 PST | Thu Jan 01 00:00:00 1970 PST | @ 9861 days 17 hours 32 mins 1 sec - | Tue Dec 31 17:32:01 1996 PST | Wed Feb 28 17:32:01 1996 PST | @ 307 days - | Tue Dec 31 17:32:01 1996 PST | Thu Feb 29 17:32:01 1996 PST | @ 306 days - | Tue Dec 31 17:32:01 1996 PST | Fri Mar 01 17:32:01 1996 PST | @ 305 days - | Tue Dec 31 17:32:01 1996 PST | Mon Dec 30 17:32:01 1996 PST | @ 1 day - | Tue Dec 31 17:32:01 1996 PST | Tue Dec 31 17:32:01 1996 PST | @ 0 - | Tue Dec 31 17:32:01 1996 PST | Fri Dec 31 17:32:01 1999 PST | @ 1095 days ago - | Tue Dec 31 17:32:01 1996 PST | Sat Jan 01 17:32:01 2000 PST | @ 1096 days ago - | Tue Dec 31 17:32:01 1996 PST | Wed Mar 15 02:14:05 2000 PST | @ 1169 days 8 hours 42 mins 4 secs ago - | Tue Dec 31 17:32:01 1996 PST | Wed Mar 15 03:14:04 2000 PST | @ 1169 days 9 hours 42 mins 3 secs ago - | Tue Dec 31 17:32:01 1996 PST | Wed Mar 15 08:14:01 2000 PST | @ 1169 days 14 hours 42 mins ago - | Tue Dec 31 17:32:01 1996 PST | Wed Mar 15 12:14:03 2000 PST | @ 1169 days 18 hours 42 mins 2 secs ago - | Tue Dec 31 17:32:01 1996 PST | Wed Mar 15 13:14:02 2000 PST | @ 1169 days 19 hours 42 mins 1 sec ago - | Tue Dec 31 17:32:01 1996 PST | Sun Dec 31 17:32:01 2000 PST | @ 1461 days ago - | Tue Dec 31 17:32:01 1996 PST | Mon Jan 01 17:32:01 2001 PST | @ 1462 days ago - | Tue Dec 31 17:32:01 1996 PST | Sat Sep 22 18:19:20 2001 PDT | @ 1725 days 23 hours 47 mins 19 secs ago - | Fri Dec 31 17:32:01 1999 PST | Thu Jan 01 00:00:00 1970 PST | @ 10956 days 17 hours 32 mins 1 sec - | Fri Dec 31 17:32:01 1999 PST | Wed Feb 28 17:32:01 1996 PST | @ 1402 days - | Fri Dec 31 17:32:01 1999 PST | Thu Feb 29 17:32:01 1996 PST | @ 1401 days - | Fri Dec 31 17:32:01 1999 PST | Fri Mar 01 17:32:01 1996 PST | @ 1400 days - | Fri Dec 31 17:32:01 1999 PST | Mon Dec 30 17:32:01 1996 PST | @ 1096 days - | Fri Dec 31 17:32:01 1999 PST | Tue Dec 31 17:32:01 1996 PST | @ 1095 days - | Fri Dec 31 17:32:01 1999 PST | Fri Dec 31 17:32:01 1999 PST | @ 0 - | Fri Dec 31 17:32:01 1999 PST | Sat Jan 01 17:32:01 2000 PST | @ 1 day ago - | Fri Dec 31 17:32:01 1999 PST | Wed Mar 15 02:14:05 2000 PST | @ 74 days 8 hours 42 mins 4 secs ago - | Fri Dec 31 17:32:01 1999 PST | Wed Mar 15 03:14:04 2000 PST | @ 74 days 9 hours 42 mins 3 secs ago - | Fri Dec 31 17:32:01 1999 PST | Wed Mar 15 08:14:01 2000 PST | @ 74 days 14 hours 42 mins ago - | Fri Dec 31 17:32:01 1999 PST | Wed Mar 15 12:14:03 2000 PST | @ 74 days 18 hours 42 mins 2 secs ago - | Fri Dec 31 17:32:01 1999 PST | Wed Mar 15 13:14:02 2000 PST | @ 74 days 19 hours 42 mins 1 sec ago - | Fri Dec 31 17:32:01 1999 PST | Sun Dec 31 17:32:01 2000 PST | @ 366 days ago - | Fri Dec 31 17:32:01 1999 PST | Mon Jan 01 17:32:01 2001 PST | @ 367 days ago - | Fri Dec 31 17:32:01 1999 PST | Sat Sep 22 18:19:20 2001 PDT | @ 630 days 23 hours 47 mins 19 secs ago - | Sat Jan 01 17:32:01 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 10957 days 17 hours 32 mins 1 sec - | Sat Jan 01 17:32:01 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1403 days - | Sat Jan 01 17:32:01 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1402 days - | Sat Jan 01 17:32:01 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1401 days - | Sat Jan 01 17:32:01 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1097 days - | Sat Jan 01 17:32:01 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1096 days - | Sat Jan 01 17:32:01 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 1 day - | Sat Jan 01 17:32:01 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 0 - | Sat Jan 01 17:32:01 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 73 days 8 hours 42 mins 4 secs ago - | Sat Jan 01 17:32:01 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 73 days 9 hours 42 mins 3 secs ago - | Sat Jan 01 17:32:01 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 73 days 14 hours 42 mins ago - | Sat Jan 01 17:32:01 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 73 days 18 hours 42 mins 2 secs ago - | Sat Jan 01 17:32:01 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 73 days 19 hours 42 mins 1 sec ago - | Sat Jan 01 17:32:01 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 365 days ago - | Sat Jan 01 17:32:01 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 366 days ago - | Sat Jan 01 17:32:01 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 629 days 23 hours 47 mins 19 secs ago - | Wed Mar 15 02:14:05 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 11031 days 2 hours 14 mins 5 secs - | Wed Mar 15 02:14:05 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1476 days 8 hours 42 mins 4 secs - | Wed Mar 15 02:14:05 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1475 days 8 hours 42 mins 4 secs - | Wed Mar 15 02:14:05 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1474 days 8 hours 42 mins 4 secs - | Wed Mar 15 02:14:05 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1170 days 8 hours 42 mins 4 secs - | Wed Mar 15 02:14:05 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1169 days 8 hours 42 mins 4 secs - | Wed Mar 15 02:14:05 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 74 days 8 hours 42 mins 4 secs - | Wed Mar 15 02:14:05 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 73 days 8 hours 42 mins 4 secs - | Wed Mar 15 02:14:05 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 0 - | Wed Mar 15 02:14:05 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 59 mins 59 secs ago - | Wed Mar 15 02:14:05 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 5 hours 59 mins 56 secs ago - | Wed Mar 15 02:14:05 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 9 hours 59 mins 58 secs ago - | Wed Mar 15 02:14:05 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 10 hours 59 mins 57 secs ago - | Wed Mar 15 02:14:05 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 291 days 15 hours 17 mins 56 secs ago - | Wed Mar 15 02:14:05 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 292 days 15 hours 17 mins 56 secs ago - | Wed Mar 15 02:14:05 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 556 days 15 hours 5 mins 15 secs ago - | Wed Mar 15 03:14:04 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 11031 days 3 hours 14 mins 4 secs - | Wed Mar 15 03:14:04 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1476 days 9 hours 42 mins 3 secs - | Wed Mar 15 03:14:04 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1475 days 9 hours 42 mins 3 secs - | Wed Mar 15 03:14:04 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1474 days 9 hours 42 mins 3 secs - | Wed Mar 15 03:14:04 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1170 days 9 hours 42 mins 3 secs - | Wed Mar 15 03:14:04 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1169 days 9 hours 42 mins 3 secs - | Wed Mar 15 03:14:04 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 74 days 9 hours 42 mins 3 secs - | Wed Mar 15 03:14:04 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 73 days 9 hours 42 mins 3 secs - | Wed Mar 15 03:14:04 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 59 mins 59 secs - | Wed Mar 15 03:14:04 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 0 - | Wed Mar 15 03:14:04 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 4 hours 59 mins 57 secs ago - | Wed Mar 15 03:14:04 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 8 hours 59 mins 59 secs ago - | Wed Mar 15 03:14:04 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 9 hours 59 mins 58 secs ago - | Wed Mar 15 03:14:04 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 291 days 14 hours 17 mins 57 secs ago - | Wed Mar 15 03:14:04 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 292 days 14 hours 17 mins 57 secs ago - | Wed Mar 15 03:14:04 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 556 days 14 hours 5 mins 16 secs ago - | Wed Mar 15 08:14:01 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 11031 days 8 hours 14 mins 1 sec - | Wed Mar 15 08:14:01 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1476 days 14 hours 42 mins - | Wed Mar 15 08:14:01 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1475 days 14 hours 42 mins - | Wed Mar 15 08:14:01 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1474 days 14 hours 42 mins - | Wed Mar 15 08:14:01 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1170 days 14 hours 42 mins - | Wed Mar 15 08:14:01 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1169 days 14 hours 42 mins - | Wed Mar 15 08:14:01 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 74 days 14 hours 42 mins - | Wed Mar 15 08:14:01 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 73 days 14 hours 42 mins - | Wed Mar 15 08:14:01 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 5 hours 59 mins 56 secs - | Wed Mar 15 08:14:01 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 4 hours 59 mins 57 secs - | Wed Mar 15 08:14:01 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 0 - | Wed Mar 15 08:14:01 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 4 hours 2 secs ago - | Wed Mar 15 08:14:01 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 5 hours 1 sec ago - | Wed Mar 15 08:14:01 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 291 days 9 hours 18 mins ago - | Wed Mar 15 08:14:01 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 292 days 9 hours 18 mins ago - | Wed Mar 15 08:14:01 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 556 days 9 hours 5 mins 19 secs ago - | Wed Mar 15 12:14:03 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 11031 days 12 hours 14 mins 3 secs - | Wed Mar 15 12:14:03 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1476 days 18 hours 42 mins 2 secs - | Wed Mar 15 12:14:03 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1475 days 18 hours 42 mins 2 secs - | Wed Mar 15 12:14:03 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1474 days 18 hours 42 mins 2 secs - | Wed Mar 15 12:14:03 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1170 days 18 hours 42 mins 2 secs - | Wed Mar 15 12:14:03 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1169 days 18 hours 42 mins 2 secs - | Wed Mar 15 12:14:03 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 74 days 18 hours 42 mins 2 secs - | Wed Mar 15 12:14:03 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 73 days 18 hours 42 mins 2 secs - | Wed Mar 15 12:14:03 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 9 hours 59 mins 58 secs - | Wed Mar 15 12:14:03 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 8 hours 59 mins 59 secs - | Wed Mar 15 12:14:03 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 4 hours 2 secs - | Wed Mar 15 12:14:03 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 0 - | Wed Mar 15 12:14:03 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 59 mins 59 secs ago - | Wed Mar 15 12:14:03 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 291 days 5 hours 17 mins 58 secs ago - | Wed Mar 15 12:14:03 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 292 days 5 hours 17 mins 58 secs ago - | Wed Mar 15 12:14:03 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 556 days 5 hours 5 mins 17 secs ago - | Wed Mar 15 13:14:02 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 11031 days 13 hours 14 mins 2 secs - | Wed Mar 15 13:14:02 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1476 days 19 hours 42 mins 1 sec - | Wed Mar 15 13:14:02 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1475 days 19 hours 42 mins 1 sec - | Wed Mar 15 13:14:02 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1474 days 19 hours 42 mins 1 sec - | Wed Mar 15 13:14:02 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1170 days 19 hours 42 mins 1 sec - | Wed Mar 15 13:14:02 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1169 days 19 hours 42 mins 1 sec - | Wed Mar 15 13:14:02 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 74 days 19 hours 42 mins 1 sec - | Wed Mar 15 13:14:02 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 73 days 19 hours 42 mins 1 sec - | Wed Mar 15 13:14:02 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 10 hours 59 mins 57 secs - | Wed Mar 15 13:14:02 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 9 hours 59 mins 58 secs - | Wed Mar 15 13:14:02 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 5 hours 1 sec - | Wed Mar 15 13:14:02 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 59 mins 59 secs - | Wed Mar 15 13:14:02 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 0 - | Wed Mar 15 13:14:02 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 291 days 4 hours 17 mins 59 secs ago - | Wed Mar 15 13:14:02 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 292 days 4 hours 17 mins 59 secs ago - | Wed Mar 15 13:14:02 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 556 days 4 hours 5 mins 18 secs ago - | Sun Dec 31 17:32:01 2000 PST | Thu Jan 01 00:00:00 1970 PST | @ 11322 days 17 hours 32 mins 1 sec - | Sun Dec 31 17:32:01 2000 PST | Wed Feb 28 17:32:01 1996 PST | @ 1768 days - | Sun Dec 31 17:32:01 2000 PST | Thu Feb 29 17:32:01 1996 PST | @ 1767 days - | Sun Dec 31 17:32:01 2000 PST | Fri Mar 01 17:32:01 1996 PST | @ 1766 days - | Sun Dec 31 17:32:01 2000 PST | Mon Dec 30 17:32:01 1996 PST | @ 1462 days - | Sun Dec 31 17:32:01 2000 PST | Tue Dec 31 17:32:01 1996 PST | @ 1461 days - | Sun Dec 31 17:32:01 2000 PST | Fri Dec 31 17:32:01 1999 PST | @ 366 days - | Sun Dec 31 17:32:01 2000 PST | Sat Jan 01 17:32:01 2000 PST | @ 365 days - | Sun Dec 31 17:32:01 2000 PST | Wed Mar 15 02:14:05 2000 PST | @ 291 days 15 hours 17 mins 56 secs - | Sun Dec 31 17:32:01 2000 PST | Wed Mar 15 03:14:04 2000 PST | @ 291 days 14 hours 17 mins 57 secs - | Sun Dec 31 17:32:01 2000 PST | Wed Mar 15 08:14:01 2000 PST | @ 291 days 9 hours 18 mins - | Sun Dec 31 17:32:01 2000 PST | Wed Mar 15 12:14:03 2000 PST | @ 291 days 5 hours 17 mins 58 secs - | Sun Dec 31 17:32:01 2000 PST | Wed Mar 15 13:14:02 2000 PST | @ 291 days 4 hours 17 mins 59 secs - | Sun Dec 31 17:32:01 2000 PST | Sun Dec 31 17:32:01 2000 PST | @ 0 - | Sun Dec 31 17:32:01 2000 PST | Mon Jan 01 17:32:01 2001 PST | @ 1 day ago - | Sun Dec 31 17:32:01 2000 PST | Sat Sep 22 18:19:20 2001 PDT | @ 264 days 23 hours 47 mins 19 secs ago - | Mon Jan 01 17:32:01 2001 PST | Thu Jan 01 00:00:00 1970 PST | @ 11323 days 17 hours 32 mins 1 sec - | Mon Jan 01 17:32:01 2001 PST | Wed Feb 28 17:32:01 1996 PST | @ 1769 days - | Mon Jan 01 17:32:01 2001 PST | Thu Feb 29 17:32:01 1996 PST | @ 1768 days - | Mon Jan 01 17:32:01 2001 PST | Fri Mar 01 17:32:01 1996 PST | @ 1767 days - | Mon Jan 01 17:32:01 2001 PST | Mon Dec 30 17:32:01 1996 PST | @ 1463 days - | Mon Jan 01 17:32:01 2001 PST | Tue Dec 31 17:32:01 1996 PST | @ 1462 days - | Mon Jan 01 17:32:01 2001 PST | Fri Dec 31 17:32:01 1999 PST | @ 367 days - | Mon Jan 01 17:32:01 2001 PST | Sat Jan 01 17:32:01 2000 PST | @ 366 days - | Mon Jan 01 17:32:01 2001 PST | Wed Mar 15 02:14:05 2000 PST | @ 292 days 15 hours 17 mins 56 secs - | Mon Jan 01 17:32:01 2001 PST | Wed Mar 15 03:14:04 2000 PST | @ 292 days 14 hours 17 mins 57 secs - | Mon Jan 01 17:32:01 2001 PST | Wed Mar 15 08:14:01 2000 PST | @ 292 days 9 hours 18 mins - | Mon Jan 01 17:32:01 2001 PST | Wed Mar 15 12:14:03 2000 PST | @ 292 days 5 hours 17 mins 58 secs - | Mon Jan 01 17:32:01 2001 PST | Wed Mar 15 13:14:02 2000 PST | @ 292 days 4 hours 17 mins 59 secs - | Mon Jan 01 17:32:01 2001 PST | Sun Dec 31 17:32:01 2000 PST | @ 1 day - | Mon Jan 01 17:32:01 2001 PST | Mon Jan 01 17:32:01 2001 PST | @ 0 - | Mon Jan 01 17:32:01 2001 PST | Sat Sep 22 18:19:20 2001 PDT | @ 263 days 23 hours 47 mins 19 secs ago - | Sat Sep 22 18:19:20 2001 PDT | Thu Jan 01 00:00:00 1970 PST | @ 11587 days 17 hours 19 mins 20 secs - | Sat Sep 22 18:19:20 2001 PDT | Wed Feb 28 17:32:01 1996 PST | @ 2032 days 23 hours 47 mins 19 secs - | Sat Sep 22 18:19:20 2001 PDT | Thu Feb 29 17:32:01 1996 PST | @ 2031 days 23 hours 47 mins 19 secs - | Sat Sep 22 18:19:20 2001 PDT | Fri Mar 01 17:32:01 1996 PST | @ 2030 days 23 hours 47 mins 19 secs - | Sat Sep 22 18:19:20 2001 PDT | Mon Dec 30 17:32:01 1996 PST | @ 1726 days 23 hours 47 mins 19 secs - | Sat Sep 22 18:19:20 2001 PDT | Tue Dec 31 17:32:01 1996 PST | @ 1725 days 23 hours 47 mins 19 secs - | Sat Sep 22 18:19:20 2001 PDT | Fri Dec 31 17:32:01 1999 PST | @ 630 days 23 hours 47 mins 19 secs - | Sat Sep 22 18:19:20 2001 PDT | Sat Jan 01 17:32:01 2000 PST | @ 629 days 23 hours 47 mins 19 secs - | Sat Sep 22 18:19:20 2001 PDT | Wed Mar 15 02:14:05 2000 PST | @ 556 days 15 hours 5 mins 15 secs - | Sat Sep 22 18:19:20 2001 PDT | Wed Mar 15 03:14:04 2000 PST | @ 556 days 14 hours 5 mins 16 secs - | Sat Sep 22 18:19:20 2001 PDT | Wed Mar 15 08:14:01 2000 PST | @ 556 days 9 hours 5 mins 19 secs - | Sat Sep 22 18:19:20 2001 PDT | Wed Mar 15 12:14:03 2000 PST | @ 556 days 5 hours 5 mins 17 secs - | Sat Sep 22 18:19:20 2001 PDT | Wed Mar 15 13:14:02 2000 PST | @ 556 days 4 hours 5 mins 18 secs - | Sat Sep 22 18:19:20 2001 PDT | Sun Dec 31 17:32:01 2000 PST | @ 264 days 23 hours 47 mins 19 secs - | Sat Sep 22 18:19:20 2001 PDT | Mon Jan 01 17:32:01 2001 PST | @ 263 days 23 hours 47 mins 19 secs - | Sat Sep 22 18:19:20 2001 PDT | Sat Sep 22 18:19:20 2001 PDT | @ 0 -(256 rows) - --- --- abstime, reltime arithmetic --- -SELECT '' AS ten, ABSTIME_TBL.f1 AS abstime, RELTIME_TBL.f1 AS reltime - WHERE (ABSTIME_TBL.f1 + RELTIME_TBL.f1) < abstime 'Jan 14 14:00:00 1971' - ORDER BY abstime, reltime; - ten | abstime | reltime ------+------------------------------+--------------- - | Sat May 10 23:59:12 1947 PDT | @ 14 secs ago - | Sat May 10 23:59:12 1947 PDT | @ 1 min - | Sat May 10 23:59:12 1947 PDT | @ 5 hours - | Sat May 10 23:59:12 1947 PDT | @ 10 days - | Sat May 10 23:59:12 1947 PDT | @ 3 mons - | Wed Dec 31 16:00:00 1969 PST | @ 14 secs ago - | Wed Dec 31 16:00:00 1969 PST | @ 1 min - | Wed Dec 31 16:00:00 1969 PST | @ 5 hours - | Wed Dec 31 16:00:00 1969 PST | @ 10 days - | Wed Dec 31 16:00:00 1969 PST | @ 3 mons -(10 rows) - --- these four queries should return the same answer --- the "infinity" and "-infinity" tuples in ABSTIME_TBL cannot be added and --- therefore, should not show up in the results. -SELECT '' AS three, ABSTIME_TBL.* - WHERE (ABSTIME_TBL.f1 + reltime '@ 3 year') -- +3 years - < abstime 'Jan 14 14:00:00 1977'; - three | f1 --------+------------------------------ - | Sun Jan 14 03:14:21 1973 PST - | Wed Dec 31 16:00:00 1969 PST - | Sat May 10 23:59:12 1947 PDT -(3 rows) - -SELECT '' AS three, ABSTIME_TBL.* - WHERE (ABSTIME_TBL.f1 + reltime '@ 3 year ago') -- -3 years - < abstime 'Jan 14 14:00:00 1971'; - three | f1 --------+------------------------------ - | Sun Jan 14 03:14:21 1973 PST - | Wed Dec 31 16:00:00 1969 PST - | Sat May 10 23:59:12 1947 PDT -(3 rows) - -SELECT '' AS three, ABSTIME_TBL.* - WHERE (ABSTIME_TBL.f1 - reltime '@ 3 year') -- -(+3) years - < abstime 'Jan 14 14:00:00 1971'; - three | f1 --------+------------------------------ - | Sun Jan 14 03:14:21 1973 PST - | Wed Dec 31 16:00:00 1969 PST - | Sat May 10 23:59:12 1947 PDT -(3 rows) - -SELECT '' AS three, ABSTIME_TBL.* - WHERE (ABSTIME_TBL.f1 - reltime '@ 3 year ago') -- -(-3) years - < abstime 'Jan 14 14:00:00 1977'; - three | f1 --------+------------------------------ - | Sun Jan 14 03:14:21 1973 PST - | Wed Dec 31 16:00:00 1969 PST - | Sat May 10 23:59:12 1947 PDT -(3 rows) - --- --- Conversions --- -SELECT '' AS "16", f1 AS "timestamp", date(f1) AS date - FROM TEMP_TIMESTAMP - WHERE f1 <> timestamp 'now' - ORDER BY date, "timestamp"; - 16 | timestamp | date -----+------------------------------+------------ - | Thu Jan 01 00:00:00 1970 PST | 01-01-1970 - | Wed Feb 28 17:32:01 1996 PST | 02-28-1996 - | Thu Feb 29 17:32:01 1996 PST | 02-29-1996 - | Fri Mar 01 17:32:01 1996 PST | 03-01-1996 - | Mon Dec 30 17:32:01 1996 PST | 12-30-1996 - | Tue Dec 31 17:32:01 1996 PST | 12-31-1996 - | Fri Dec 31 17:32:01 1999 PST | 12-31-1999 - | Sat Jan 01 17:32:01 2000 PST | 01-01-2000 - | Wed Mar 15 02:14:05 2000 PST | 03-15-2000 - | Wed Mar 15 03:14:04 2000 PST | 03-15-2000 - | Wed Mar 15 08:14:01 2000 PST | 03-15-2000 - | Wed Mar 15 12:14:03 2000 PST | 03-15-2000 - | Wed Mar 15 13:14:02 2000 PST | 03-15-2000 - | Sun Dec 31 17:32:01 2000 PST | 12-31-2000 - | Mon Jan 01 17:32:01 2001 PST | 01-01-2001 - | Sat Sep 22 18:19:20 2001 PDT | 09-22-2001 -(16 rows) - -SELECT '' AS "16", f1 AS "timestamp", abstime(f1) AS abstime - FROM TEMP_TIMESTAMP - ORDER BY abstime; - 16 | timestamp | abstime -----+------------------------------+------------------------------ - | Thu Jan 01 00:00:00 1970 PST | Thu Jan 01 00:00:00 1970 PST - | Wed Feb 28 17:32:01 1996 PST | Wed Feb 28 17:32:01 1996 PST - | Thu Feb 29 17:32:01 1996 PST | Thu Feb 29 17:32:01 1996 PST - | Fri Mar 01 17:32:01 1996 PST | Fri Mar 01 17:32:01 1996 PST - | Mon Dec 30 17:32:01 1996 PST | Mon Dec 30 17:32:01 1996 PST - | Tue Dec 31 17:32:01 1996 PST | Tue Dec 31 17:32:01 1996 PST - | Fri Dec 31 17:32:01 1999 PST | Fri Dec 31 17:32:01 1999 PST - | Sat Jan 01 17:32:01 2000 PST | Sat Jan 01 17:32:01 2000 PST - | Wed Mar 15 02:14:05 2000 PST | Wed Mar 15 02:14:05 2000 PST - | Wed Mar 15 03:14:04 2000 PST | Wed Mar 15 03:14:04 2000 PST - | Wed Mar 15 08:14:01 2000 PST | Wed Mar 15 08:14:01 2000 PST - | Wed Mar 15 12:14:03 2000 PST | Wed Mar 15 12:14:03 2000 PST - | Wed Mar 15 13:14:02 2000 PST | Wed Mar 15 13:14:02 2000 PST - | Sun Dec 31 17:32:01 2000 PST | Sun Dec 31 17:32:01 2000 PST - | Mon Jan 01 17:32:01 2001 PST | Mon Jan 01 17:32:01 2001 PST - | Sat Sep 22 18:19:20 2001 PDT | Sat Sep 22 18:19:20 2001 PDT -(16 rows) - -SELECT '' AS four, f1 AS abstime, date(f1) AS date - FROM ABSTIME_TBL - WHERE isfinite(f1) AND f1 <> abstime 'now' - ORDER BY date, abstime; - four | abstime | date -------+------------------------------+------------ - | Sat May 10 23:59:12 1947 PDT | 05-10-1947 - | Wed Dec 31 16:00:00 1969 PST | 12-31-1969 - | Sun Jan 14 03:14:21 1973 PST | 01-14-1973 - | Mon May 01 00:30:30 1995 PDT | 05-01-1995 -(4 rows) - -SELECT '' AS two, d1 AS "timestamp", abstime(d1) AS abstime - FROM TIMESTAMP_TBL WHERE NOT isfinite(d1); - two | timestamp | abstime ------+-----------+----------- - | -infinity | -infinity - | infinity | infinity -(2 rows) - -SELECT '' AS three, f1 as abstime, cast(f1 as timestamp) AS "timestamp" - FROM ABSTIME_TBL WHERE NOT isfinite(f1); -ERROR: cannot convert abstime "invalid" to timestamp -SELECT '' AS ten, f1 AS interval, reltime(f1) AS reltime - FROM INTERVAL_TBL; - ten | interval | reltime ------+-------------------------------+------------------------------- - | @ 1 min | @ 1 min - | @ 5 hours | @ 5 hours - | @ 10 days | @ 10 days - | @ 34 years | @ 34 years - | @ 3 mons | @ 3 mons - | @ 14 secs ago | @ 14 secs ago - | @ 1 day 2 hours 3 mins 4 secs | @ 1 day 2 hours 3 mins 4 secs - | @ 6 years | @ 6 years - | @ 5 mons | @ 5 mons - | @ 5 mons 12 hours | @ 5 mons 12 hours -(10 rows) - -SELECT '' AS six, f1 as reltime, CAST(f1 AS interval) AS interval - FROM RELTIME_TBL; - six | reltime | interval ------+---------------+--------------- - | @ 1 min | @ 1 min - | @ 5 hours | @ 5 hours - | @ 10 days | @ 10 days - | @ 34 years | @ 34 years - | @ 3 mons | @ 3 mons - | @ 14 secs ago | @ 14 secs ago -(6 rows) - -DROP TABLE TEMP_TIMESTAMP; --- --- Formats --- -SET DateStyle TO 'US,Postgres'; -SHOW DateStyle; - DateStyle ---------------- - Postgres, MDY -(1 row) - -SELECT '' AS "64", d1 AS us_postgres FROM TIMESTAMP_TBL; - 64 | us_postgres -----+----------------------------- - | -infinity - | infinity - | Thu Jan 01 00:00:00 1970 - | 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 - | Thu Jan 02 00:00:00 1997 - | Thu Jan 02 03:04:05 1997 - | Mon Feb 10 17:32:01 1997 - | Mon Feb 10 17:32:01 1997 - | Mon Feb 10 17:32:01 1997 - | Mon Feb 10 17:32:01 1997 - | Tue Jun 10 17:32:01 1997 - | Sat Sep 22 18:19:20 2001 - | Wed Mar 15 08:14:01 2000 - | Wed Mar 15 13:14:02 2000 - | Wed Mar 15 12:14:03 2000 - | Wed Mar 15 03:14:04 2000 - | Wed Mar 15 02:14:05 2000 - | Mon Feb 10 17:32:01 1997 - | Mon Feb 10 17:32:01 1997 - | Mon Feb 10 17:32:00 1997 - | Mon Feb 10 17:32:01 1997 - | Mon Feb 10 17:32:01 1997 - | Mon Feb 10 17:32:01 1997 - | Mon Feb 10 17:32:01 1997 - | Mon Feb 10 17:32:01 1997 - | Mon Feb 10 17:32:01 1997 - | Mon Feb 10 17:32:01 1997 - | Mon Feb 10 17:32:01 1997 - | Tue Jun 10 18:32:01 1997 - | Mon Feb 10 17:32:01 1997 - | Tue Feb 11 17:32:01 1997 - | Wed Feb 12 17:32:01 1997 - | Thu Feb 13 17:32:01 1997 - | Fri Feb 14 17:32:01 1997 - | Sat Feb 15 17:32:01 1997 - | Sun Feb 16 17:32:01 1997 - | Tue Feb 16 17:32:01 0097 BC - | Sat Feb 16 17:32:01 0097 - | Thu Feb 16 17:32:01 0597 - | Tue Feb 16 17:32:01 1097 - | Sat Feb 16 17:32:01 1697 - | Thu Feb 16 17:32:01 1797 - | Tue Feb 16 17:32:01 1897 - | Sun Feb 16 17:32:01 1997 - | Sat Feb 16 17:32:01 2097 - | Wed Feb 28 17:32:01 1996 - | Thu Feb 29 17:32:01 1996 - | Fri Mar 01 17:32:01 1996 - | Mon Dec 30 17:32:01 1996 - | Tue Dec 31 17:32:01 1996 - | Wed Jan 01 17:32:01 1997 - | Fri Feb 28 17:32:01 1997 - | Sat Mar 01 17:32:01 1997 - | Tue Dec 30 17:32:01 1997 - | Wed Dec 31 17:32:01 1997 - | Fri Dec 31 17:32:01 1999 - | Sat Jan 01 17:32:01 2000 - | Sun Dec 31 17:32:01 2000 - | Mon Jan 01 17:32:01 2001 -(64 rows) - -SELECT '' AS seven, f1 AS us_postgres FROM ABSTIME_TBL; - seven | us_postgres --------+------------------------------ - | Sun Jan 14 03:14:21 1973 PST - | Mon May 01 00:30:30 1995 PDT - | Wed Dec 31 16:00:00 1969 PST - | infinity - | -infinity - | Sat May 10 23:59:12 1947 PDT - | invalid -(7 rows) - -SET DateStyle TO 'US,ISO'; -SELECT '' AS "64", d1 AS us_iso FROM TIMESTAMP_TBL; - 64 | us_iso -----+------------------------ - | -infinity - | infinity - | 1970-01-01 00:00:00 - | 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-01-02 00:00:00 - | 1997-01-02 03:04:05 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-06-10 17:32:01 - | 2001-09-22 18:19:20 - | 2000-03-15 08:14:01 - | 2000-03-15 13:14:02 - | 2000-03-15 12:14:03 - | 2000-03-15 03:14:04 - | 2000-03-15 02:14:05 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:00 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-06-10 18:32:01 - | 1997-02-10 17:32:01 - | 1997-02-11 17:32:01 - | 1997-02-12 17:32:01 - | 1997-02-13 17:32:01 - | 1997-02-14 17:32:01 - | 1997-02-15 17:32:01 - | 1997-02-16 17:32:01 - | 0097-02-16 17:32:01 BC - | 0097-02-16 17:32:01 - | 0597-02-16 17:32:01 - | 1097-02-16 17:32:01 - | 1697-02-16 17:32:01 - | 1797-02-16 17:32:01 - | 1897-02-16 17:32:01 - | 1997-02-16 17:32:01 - | 2097-02-16 17:32:01 - | 1996-02-28 17:32:01 - | 1996-02-29 17:32:01 - | 1996-03-01 17:32:01 - | 1996-12-30 17:32:01 - | 1996-12-31 17:32:01 - | 1997-01-01 17:32:01 - | 1997-02-28 17:32:01 - | 1997-03-01 17:32:01 - | 1997-12-30 17:32:01 - | 1997-12-31 17:32:01 - | 1999-12-31 17:32:01 - | 2000-01-01 17:32:01 - | 2000-12-31 17:32:01 - | 2001-01-01 17:32:01 -(64 rows) - -SELECT '' AS seven, f1 AS us_iso FROM ABSTIME_TBL; - seven | us_iso --------+------------------------ - | 1973-01-14 03:14:21-08 - | 1995-05-01 00:30:30-07 - | 1969-12-31 16:00:00-08 - | infinity - | -infinity - | 1947-05-10 23:59:12-07 - | invalid -(7 rows) - -SET DateStyle TO 'US,SQL'; -SHOW DateStyle; - DateStyle ------------ - SQL, MDY -(1 row) - -SELECT '' AS "64", d1 AS us_sql FROM TIMESTAMP_TBL; - 64 | us_sql -----+------------------------ - | -infinity - | infinity - | 01/01/1970 00:00:00 - | 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 - | 01/02/1997 00:00:00 - | 01/02/1997 03:04:05 - | 02/10/1997 17:32:01 - | 02/10/1997 17:32:01 - | 02/10/1997 17:32:01 - | 02/10/1997 17:32:01 - | 06/10/1997 17:32:01 - | 09/22/2001 18:19:20 - | 03/15/2000 08:14:01 - | 03/15/2000 13:14:02 - | 03/15/2000 12:14:03 - | 03/15/2000 03:14:04 - | 03/15/2000 02:14:05 - | 02/10/1997 17:32:01 - | 02/10/1997 17:32:01 - | 02/10/1997 17:32:00 - | 02/10/1997 17:32:01 - | 02/10/1997 17:32:01 - | 02/10/1997 17:32:01 - | 02/10/1997 17:32:01 - | 02/10/1997 17:32:01 - | 02/10/1997 17:32:01 - | 02/10/1997 17:32:01 - | 02/10/1997 17:32:01 - | 06/10/1997 18:32:01 - | 02/10/1997 17:32:01 - | 02/11/1997 17:32:01 - | 02/12/1997 17:32:01 - | 02/13/1997 17:32:01 - | 02/14/1997 17:32:01 - | 02/15/1997 17:32:01 - | 02/16/1997 17:32:01 - | 02/16/0097 17:32:01 BC - | 02/16/0097 17:32:01 - | 02/16/0597 17:32:01 - | 02/16/1097 17:32:01 - | 02/16/1697 17:32:01 - | 02/16/1797 17:32:01 - | 02/16/1897 17:32:01 - | 02/16/1997 17:32:01 - | 02/16/2097 17:32:01 - | 02/28/1996 17:32:01 - | 02/29/1996 17:32:01 - | 03/01/1996 17:32:01 - | 12/30/1996 17:32:01 - | 12/31/1996 17:32:01 - | 01/01/1997 17:32:01 - | 02/28/1997 17:32:01 - | 03/01/1997 17:32:01 - | 12/30/1997 17:32:01 - | 12/31/1997 17:32:01 - | 12/31/1999 17:32:01 - | 01/01/2000 17:32:01 - | 12/31/2000 17:32:01 - | 01/01/2001 17:32:01 -(64 rows) - -SELECT '' AS seven, f1 AS us_sql FROM ABSTIME_TBL; - seven | us_sql --------+------------------------- - | 01/14/1973 03:14:21 PST - | 05/01/1995 00:30:30 PDT - | 12/31/1969 16:00:00 PST - | infinity - | -infinity - | 05/10/1947 23:59:12 PDT - | invalid -(7 rows) - -SET DateStyle TO 'European,Postgres'; -SHOW DateStyle; - DateStyle ---------------- - Postgres, DMY -(1 row) - -INSERT INTO TIMESTAMP_TBL VALUES('13/06/1957'); -SELECT count(*) as one FROM TIMESTAMP_TBL WHERE d1 = 'Jun 13 1957'; - one ------ - 1 -(1 row) - -SELECT '' AS "65", d1 AS european_postgres FROM TIMESTAMP_TBL; - 65 | european_postgres -----+----------------------------- - | -infinity - | infinity - | Thu 01 Jan 00:00:00 1970 - | 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 - | Thu 02 Jan 00:00:00 1997 - | Thu 02 Jan 03:04:05 1997 - | Mon 10 Feb 17:32:01 1997 - | Mon 10 Feb 17:32:01 1997 - | Mon 10 Feb 17:32:01 1997 - | Mon 10 Feb 17:32:01 1997 - | Tue 10 Jun 17:32:01 1997 - | Sat 22 Sep 18:19:20 2001 - | Wed 15 Mar 08:14:01 2000 - | Wed 15 Mar 13:14:02 2000 - | Wed 15 Mar 12:14:03 2000 - | Wed 15 Mar 03:14:04 2000 - | Wed 15 Mar 02:14:05 2000 - | Mon 10 Feb 17:32:01 1997 - | Mon 10 Feb 17:32:01 1997 - | Mon 10 Feb 17:32:00 1997 - | Mon 10 Feb 17:32:01 1997 - | Mon 10 Feb 17:32:01 1997 - | Mon 10 Feb 17:32:01 1997 - | Mon 10 Feb 17:32:01 1997 - | Mon 10 Feb 17:32:01 1997 - | Mon 10 Feb 17:32:01 1997 - | Mon 10 Feb 17:32:01 1997 - | Mon 10 Feb 17:32:01 1997 - | Tue 10 Jun 18:32:01 1997 - | Mon 10 Feb 17:32:01 1997 - | Tue 11 Feb 17:32:01 1997 - | Wed 12 Feb 17:32:01 1997 - | Thu 13 Feb 17:32:01 1997 - | Fri 14 Feb 17:32:01 1997 - | Sat 15 Feb 17:32:01 1997 - | Sun 16 Feb 17:32:01 1997 - | Tue 16 Feb 17:32:01 0097 BC - | Sat 16 Feb 17:32:01 0097 - | Thu 16 Feb 17:32:01 0597 - | Tue 16 Feb 17:32:01 1097 - | Sat 16 Feb 17:32:01 1697 - | Thu 16 Feb 17:32:01 1797 - | Tue 16 Feb 17:32:01 1897 - | Sun 16 Feb 17:32:01 1997 - | Sat 16 Feb 17:32:01 2097 - | Wed 28 Feb 17:32:01 1996 - | Thu 29 Feb 17:32:01 1996 - | Fri 01 Mar 17:32:01 1996 - | Mon 30 Dec 17:32:01 1996 - | Tue 31 Dec 17:32:01 1996 - | Wed 01 Jan 17:32:01 1997 - | Fri 28 Feb 17:32:01 1997 - | Sat 01 Mar 17:32:01 1997 - | Tue 30 Dec 17:32:01 1997 - | Wed 31 Dec 17:32:01 1997 - | Fri 31 Dec 17:32:01 1999 - | Sat 01 Jan 17:32:01 2000 - | Sun 31 Dec 17:32:01 2000 - | Mon 01 Jan 17:32:01 2001 - | Thu 13 Jun 00:00:00 1957 -(65 rows) - -SELECT '' AS seven, f1 AS european_postgres FROM ABSTIME_TBL; - seven | european_postgres --------+------------------------------ - | Sun 14 Jan 03:14:21 1973 PST - | Mon 01 May 00:30:30 1995 PDT - | Wed 31 Dec 16:00:00 1969 PST - | infinity - | -infinity - | Sat 10 May 23:59:12 1947 PDT - | invalid -(7 rows) - -SET DateStyle TO 'European,ISO'; -SHOW DateStyle; - DateStyle ------------ - ISO, DMY -(1 row) - -SELECT '' AS "65", d1 AS european_iso FROM TIMESTAMP_TBL; - 65 | european_iso -----+------------------------ - | -infinity - | infinity - | 1970-01-01 00:00:00 - | 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-01-02 00:00:00 - | 1997-01-02 03:04:05 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-06-10 17:32:01 - | 2001-09-22 18:19:20 - | 2000-03-15 08:14:01 - | 2000-03-15 13:14:02 - | 2000-03-15 12:14:03 - | 2000-03-15 03:14:04 - | 2000-03-15 02:14:05 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:00 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-02-10 17:32:01 - | 1997-06-10 18:32:01 - | 1997-02-10 17:32:01 - | 1997-02-11 17:32:01 - | 1997-02-12 17:32:01 - | 1997-02-13 17:32:01 - | 1997-02-14 17:32:01 - | 1997-02-15 17:32:01 - | 1997-02-16 17:32:01 - | 0097-02-16 17:32:01 BC - | 0097-02-16 17:32:01 - | 0597-02-16 17:32:01 - | 1097-02-16 17:32:01 - | 1697-02-16 17:32:01 - | 1797-02-16 17:32:01 - | 1897-02-16 17:32:01 - | 1997-02-16 17:32:01 - | 2097-02-16 17:32:01 - | 1996-02-28 17:32:01 - | 1996-02-29 17:32:01 - | 1996-03-01 17:32:01 - | 1996-12-30 17:32:01 - | 1996-12-31 17:32:01 - | 1997-01-01 17:32:01 - | 1997-02-28 17:32:01 - | 1997-03-01 17:32:01 - | 1997-12-30 17:32:01 - | 1997-12-31 17:32:01 - | 1999-12-31 17:32:01 - | 2000-01-01 17:32:01 - | 2000-12-31 17:32:01 - | 2001-01-01 17:32:01 - | 1957-06-13 00:00:00 -(65 rows) - -SELECT '' AS seven, f1 AS european_iso FROM ABSTIME_TBL; - seven | european_iso --------+------------------------ - | 1973-01-14 03:14:21-08 - | 1995-05-01 00:30:30-07 - | 1969-12-31 16:00:00-08 - | infinity - | -infinity - | 1947-05-10 23:59:12-07 - | invalid -(7 rows) - -SET DateStyle TO 'European,SQL'; -SHOW DateStyle; - DateStyle ------------ - SQL, DMY -(1 row) - -SELECT '' AS "65", d1 AS european_sql FROM TIMESTAMP_TBL; - 65 | european_sql -----+------------------------ - | -infinity - | infinity - | 01/01/1970 00:00:00 - | 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 - | 02/01/1997 00:00:00 - | 02/01/1997 03:04:05 - | 10/02/1997 17:32:01 - | 10/02/1997 17:32:01 - | 10/02/1997 17:32:01 - | 10/02/1997 17:32:01 - | 10/06/1997 17:32:01 - | 22/09/2001 18:19:20 - | 15/03/2000 08:14:01 - | 15/03/2000 13:14:02 - | 15/03/2000 12:14:03 - | 15/03/2000 03:14:04 - | 15/03/2000 02:14:05 - | 10/02/1997 17:32:01 - | 10/02/1997 17:32:01 - | 10/02/1997 17:32:00 - | 10/02/1997 17:32:01 - | 10/02/1997 17:32:01 - | 10/02/1997 17:32:01 - | 10/02/1997 17:32:01 - | 10/02/1997 17:32:01 - | 10/02/1997 17:32:01 - | 10/02/1997 17:32:01 - | 10/02/1997 17:32:01 - | 10/06/1997 18:32:01 - | 10/02/1997 17:32:01 - | 11/02/1997 17:32:01 - | 12/02/1997 17:32:01 - | 13/02/1997 17:32:01 - | 14/02/1997 17:32:01 - | 15/02/1997 17:32:01 - | 16/02/1997 17:32:01 - | 16/02/0097 17:32:01 BC - | 16/02/0097 17:32:01 - | 16/02/0597 17:32:01 - | 16/02/1097 17:32:01 - | 16/02/1697 17:32:01 - | 16/02/1797 17:32:01 - | 16/02/1897 17:32:01 - | 16/02/1997 17:32:01 - | 16/02/2097 17:32:01 - | 28/02/1996 17:32:01 - | 29/02/1996 17:32:01 - | 01/03/1996 17:32:01 - | 30/12/1996 17:32:01 - | 31/12/1996 17:32:01 - | 01/01/1997 17:32:01 - | 28/02/1997 17:32:01 - | 01/03/1997 17:32:01 - | 30/12/1997 17:32:01 - | 31/12/1997 17:32:01 - | 31/12/1999 17:32:01 - | 01/01/2000 17:32:01 - | 31/12/2000 17:32:01 - | 01/01/2001 17:32:01 - | 13/06/1957 00:00:00 -(65 rows) - -SELECT '' AS seven, f1 AS european_sql FROM ABSTIME_TBL; - seven | european_sql --------+------------------------- - | 14/01/1973 03:14:21 PST - | 01/05/1995 00:30:30 PDT - | 31/12/1969 16:00:00 PST - | infinity - | -infinity - | 10/05/1947 23:59:12 PDT - | invalid -(7 rows) - -RESET DateStyle; diff --git a/src/test/regress/expected/tinterval-solaris-1947.out b/src/test/regress/expected/tinterval-solaris-1947.out deleted file mode 100644 index d3eb74516a..0000000000 --- a/src/test/regress/expected/tinterval-solaris-1947.out +++ /dev/null @@ -1,170 +0,0 @@ --- --- TINTERVAL --- -CREATE TABLE TINTERVAL_TBL (f1 tinterval); --- Should accept any abstime, --- so do not bother with extensive testing of values -INSERT INTO TINTERVAL_TBL (f1) - VALUES ('["-infinity" "infinity"]'); -INSERT INTO TINTERVAL_TBL (f1) - VALUES ('["May 10, 1947 23:59:12" "Jan 14, 1973 03:14:21"]'); -INSERT INTO TINTERVAL_TBL (f1) - VALUES ('["Sep 4, 1983 23:59:12" "Oct 4, 1983 23:59:12"]'); -INSERT INTO TINTERVAL_TBL (f1) - VALUES ('["epoch" "Mon May 1 00:30:30 1995"]'); -INSERT INTO TINTERVAL_TBL (f1) - VALUES ('["Feb 15 1990 12:15:03" "2001-09-23 11:12:13"]'); --- badly formatted tintervals -INSERT INTO TINTERVAL_TBL (f1) - VALUES ('["bad time specifications" ""]'); -ERROR: invalid input syntax for type abstime: "bad time specifications" -INSERT INTO TINTERVAL_TBL (f1) - VALUES ('["" "infinity"]'); -ERROR: invalid input syntax for type abstime: "" --- test tinterval operators -SELECT '' AS five, TINTERVAL_TBL.*; - five | f1 -------+----------------------------------------------------------------- - | ["-infinity" "infinity"] - | ["Sat May 10 23:59:12 1947 PDT" "Sun Jan 14 03:14:21 1973 PST"] - | ["Sun Sep 04 23:59:12 1983 PDT" "Tue Oct 04 23:59:12 1983 PDT"] - | ["Wed Dec 31 16:00:00 1969 PST" "Mon May 01 00:30:30 1995 PDT"] - | ["Thu Feb 15 12:15:03 1990 PST" "Sun Sep 23 11:12:13 2001 PDT"] -(5 rows) - --- length == -SELECT '' AS one, t.* - FROM TINTERVAL_TBL t - WHERE t.f1 #= '@ 1 months'; - one | f1 ------+----------------------------------------------------------------- - | ["Sun Sep 04 23:59:12 1983 PDT" "Tue Oct 04 23:59:12 1983 PDT"] -(1 row) - --- length <> -SELECT '' AS three, t.* - FROM TINTERVAL_TBL t - WHERE t.f1 #<> '@ 1 months'; - three | f1 --------+----------------------------------------------------------------- - | ["Sat May 10 23:59:12 1947 PDT" "Sun Jan 14 03:14:21 1973 PST"] - | ["Wed Dec 31 16:00:00 1969 PST" "Mon May 01 00:30:30 1995 PDT"] - | ["Thu Feb 15 12:15:03 1990 PST" "Sun Sep 23 11:12:13 2001 PDT"] -(3 rows) - --- length < -SELECT '' AS zero, t.* - FROM TINTERVAL_TBL t - WHERE t.f1 #< '@ 1 month'; - zero | f1 -------+---- -(0 rows) - --- length <= -SELECT '' AS one, t.* - FROM TINTERVAL_TBL t - WHERE t.f1 #<= '@ 1 month'; - one | f1 ------+----------------------------------------------------------------- - | ["Sun Sep 04 23:59:12 1983 PDT" "Tue Oct 04 23:59:12 1983 PDT"] -(1 row) - --- length > -SELECT '' AS three, t.* - FROM TINTERVAL_TBL t - WHERE t.f1 #> '@ 1 year'; - three | f1 --------+----------------------------------------------------------------- - | ["Sat May 10 23:59:12 1947 PDT" "Sun Jan 14 03:14:21 1973 PST"] - | ["Wed Dec 31 16:00:00 1969 PST" "Mon May 01 00:30:30 1995 PDT"] - | ["Thu Feb 15 12:15:03 1990 PST" "Sun Sep 23 11:12:13 2001 PDT"] -(3 rows) - --- length >= -SELECT '' AS three, t.* - FROM TINTERVAL_TBL t - WHERE t.f1 #>= '@ 3 years'; - three | f1 --------+----------------------------------------------------------------- - | ["Sat May 10 23:59:12 1947 PDT" "Sun Jan 14 03:14:21 1973 PST"] - | ["Wed Dec 31 16:00:00 1969 PST" "Mon May 01 00:30:30 1995 PDT"] - | ["Thu Feb 15 12:15:03 1990 PST" "Sun Sep 23 11:12:13 2001 PDT"] -(3 rows) - --- overlaps -SELECT '' AS three, t1.* - FROM TINTERVAL_TBL t1 - WHERE t1.f1 && - tinterval '["Aug 15 14:23:19 1983" "Sep 16 14:23:19 1983"]'; - three | f1 --------+----------------------------------------------------------------- - | ["-infinity" "infinity"] - | ["Sun Sep 04 23:59:12 1983 PDT" "Tue Oct 04 23:59:12 1983 PDT"] - | ["Wed Dec 31 16:00:00 1969 PST" "Mon May 01 00:30:30 1995 PDT"] -(3 rows) - -SET geqo TO 'off'; -SELECT '' AS five, t1.f1, t2.f1 - FROM TINTERVAL_TBL t1, TINTERVAL_TBL t2 - WHERE t1.f1 && t2.f1 and - t1.f1 = t2.f1 - ORDER BY t1.f1, t2.f1; - five | f1 | f1 -------+-----------------------------------------------------------------+----------------------------------------------------------------- - | ["-infinity" "infinity"] | ["-infinity" "infinity"] - | ["Sun Sep 04 23:59:12 1983 PDT" "Tue Oct 04 23:59:12 1983 PDT"] | ["Sun Sep 04 23:59:12 1983 PDT" "Tue Oct 04 23:59:12 1983 PDT"] - | ["Thu Feb 15 12:15:03 1990 PST" "Sun Sep 23 11:12:13 2001 PDT"] | ["Thu Feb 15 12:15:03 1990 PST" "Sun Sep 23 11:12:13 2001 PDT"] - | ["Wed Dec 31 16:00:00 1969 PST" "Mon May 01 00:30:30 1995 PDT"] | ["Wed Dec 31 16:00:00 1969 PST" "Mon May 01 00:30:30 1995 PDT"] - | ["Sat May 10 23:59:12 1947 PDT" "Sun Jan 14 03:14:21 1973 PST"] | ["Sat May 10 23:59:12 1947 PDT" "Sun Jan 14 03:14:21 1973 PST"] -(5 rows) - -SELECT '' AS fourteen, t1.f1 AS interval1, t2.f1 AS interval2 - FROM TINTERVAL_TBL t1, TINTERVAL_TBL t2 - WHERE t1.f1 && t2.f1 and not t1.f1 = t2.f1 - ORDER BY interval1, interval2; - fourteen | interval1 | interval2 -----------+-----------------------------------------------------------------+----------------------------------------------------------------- - | ["-infinity" "infinity"] | ["Sun Sep 04 23:59:12 1983 PDT" "Tue Oct 04 23:59:12 1983 PDT"] - | ["-infinity" "infinity"] | ["Thu Feb 15 12:15:03 1990 PST" "Sun Sep 23 11:12:13 2001 PDT"] - | ["-infinity" "infinity"] | ["Wed Dec 31 16:00:00 1969 PST" "Mon May 01 00:30:30 1995 PDT"] - | ["-infinity" "infinity"] | ["Sat May 10 23:59:12 1947 PDT" "Sun Jan 14 03:14:21 1973 PST"] - | ["Sun Sep 04 23:59:12 1983 PDT" "Tue Oct 04 23:59:12 1983 PDT"] | ["-infinity" "infinity"] - | ["Sun Sep 04 23:59:12 1983 PDT" "Tue Oct 04 23:59:12 1983 PDT"] | ["Wed Dec 31 16:00:00 1969 PST" "Mon May 01 00:30:30 1995 PDT"] - | ["Thu Feb 15 12:15:03 1990 PST" "Sun Sep 23 11:12:13 2001 PDT"] | ["-infinity" "infinity"] - | ["Thu Feb 15 12:15:03 1990 PST" "Sun Sep 23 11:12:13 2001 PDT"] | ["Wed Dec 31 16:00:00 1969 PST" "Mon May 01 00:30:30 1995 PDT"] - | ["Wed Dec 31 16:00:00 1969 PST" "Mon May 01 00:30:30 1995 PDT"] | ["-infinity" "infinity"] - | ["Wed Dec 31 16:00:00 1969 PST" "Mon May 01 00:30:30 1995 PDT"] | ["Sun Sep 04 23:59:12 1983 PDT" "Tue Oct 04 23:59:12 1983 PDT"] - | ["Wed Dec 31 16:00:00 1969 PST" "Mon May 01 00:30:30 1995 PDT"] | ["Thu Feb 15 12:15:03 1990 PST" "Sun Sep 23 11:12:13 2001 PDT"] - | ["Wed Dec 31 16:00:00 1969 PST" "Mon May 01 00:30:30 1995 PDT"] | ["Sat May 10 23:59:12 1947 PDT" "Sun Jan 14 03:14:21 1973 PST"] - | ["Sat May 10 23:59:12 1947 PDT" "Sun Jan 14 03:14:21 1973 PST"] | ["-infinity" "infinity"] - | ["Sat May 10 23:59:12 1947 PDT" "Sun Jan 14 03:14:21 1973 PST"] | ["Wed Dec 31 16:00:00 1969 PST" "Mon May 01 00:30:30 1995 PDT"] -(14 rows) - --- contains -SELECT '' AS five, t1.f1 - FROM TINTERVAL_TBL t1 - WHERE not t1.f1 << - tinterval '["Aug 15 14:23:19 1980" "Sep 16 14:23:19 1990"]' - ORDER BY t1.f1; - five | f1 -------+----------------------------------------------------------------- - | ["Sun Sep 04 23:59:12 1983 PDT" "Tue Oct 04 23:59:12 1983 PDT"] - | ["Thu Feb 15 12:15:03 1990 PST" "Sun Sep 23 11:12:13 2001 PDT"] - | ["Sat May 10 23:59:12 1947 PDT" "Sun Jan 14 03:14:21 1973 PST"] -(3 rows) - --- make time interval -SELECT '' AS three, t1.f1 - FROM TINTERVAL_TBL t1 - WHERE t1.f1 && - (abstime 'Aug 15 14:23:19 1983' <#> - abstime 'Sep 16 14:23:19 1983') - ORDER BY t1.f1; - three | f1 --------+----------------------------------------------------------------- - | ["-infinity" "infinity"] - | ["Sun Sep 04 23:59:12 1983 PDT" "Tue Oct 04 23:59:12 1983 PDT"] - | ["Wed Dec 31 16:00:00 1969 PST" "Mon May 01 00:30:30 1995 PDT"] -(3 rows) - -RESET geqo; diff --git a/src/test/regress/resultmap b/src/test/regress/resultmap index 52b47e593b..313eca30e9 100644 --- a/src/test/regress/resultmap +++ b/src/test/regress/resultmap @@ -1,11 +1,3 @@ -abstime/.*-aix4=abstime-solaris-1947 -abstime/.*-aix5=abstime-solaris-1947 -abstime/alpha.*-dec-osf=abstime-solaris-1947 -abstime/.*-irix=abstime-solaris-1947 -abstime/i.86-pc-solaris=abstime-solaris-1947 -abstime/sparc-sun-solaris=abstime-solaris-1947 -abstime/.*-sco=abstime-solaris-1947 -abstime/.*-sysv5=abstime-solaris-1947 float4/.*-qnx=float4-exp-three-digits float4/i.86-pc-mingw32=float4-exp-three-digits float8/i.86-.*-freebsd[234]=float8-small-is-zero @@ -14,24 +6,5 @@ float8/i.86-.*-netbsd=float8-small-is-zero float8/.*-qnx=float8-exp-three-digits float8/i.86-pc-mingw32=float8-exp-three-digits-win32 float8/i.86-pc-cygwin=float8-small-is-zero -horology/.*-aix4=horology-solaris-1947 -horology/.*-aix5=horology-solaris-1947 -horology/alpha.*-dec-osf=horology-solaris-1947 -horology/.*-cygwin=horology-no-DST-before-1970 -horology/.*-hpux=horology-no-DST-before-1970 -horology/.*-irix=horology-solaris-1947 -horology/i.86-pc-solaris=horology-solaris-1947 -horology/sparc-sun-solaris=horology-solaris-1947 -horology/sparc-sun-sunos4.*=horology-no-DST-before-1970 -horology/.*-sysv5=horology-solaris-1947 -horology/.*-sco=horology-solaris-1947 int8/.*-qnx=int8-exp-three-digits int8/i.86-pc-mingw32=int8-exp-three-digits-win32 -tinterval/.*-aix4=tinterval-solaris-1947 -tinterval/.*-aix5=tinterval-solaris-1947 -tinterval/alpha.*-dec-osf=tinterval-solaris-1947 -tinterval/.*-irix=tinterval-solaris-1947 -tinterval/i.86-pc-solaris=tinterval-solaris-1947 -tinterval/sparc-sun-solaris=tinterval-solaris-1947 -tinterval/.*-sysv5=tinterval-solaris-1947 -tinterval/.*-sco=tinterval-solaris-1947 diff --git a/src/timezone/Makefile b/src/timezone/Makefile index 8eb7ee3fc3..9b766dc5f5 100644 --- a/src/timezone/Makefile +++ b/src/timezone/Makefile @@ -4,7 +4,7 @@ # Makefile for the timezone library # IDENTIFICATION -# $PostgreSQL: pgsql/src/timezone/Makefile,v 1.9 2004/05/18 04:10:33 momjian Exp $ +# $PostgreSQL: pgsql/src/timezone/Makefile,v 1.10 2004/05/21 05:08:06 tgl Exp $ # #------------------------------------------------------------------------- @@ -12,13 +12,17 @@ subdir = src/timezone top_builddir = ../.. include $(top_builddir)/src/Makefile.global -OBJS= asctime.o difftime.o localtime.o pgtz.o -ZICOBJS= zic.o ialloc.o scheck.o localtime.o asctime.o pgtz.o +# files to build into backend +OBJS= localtime.o strftime.o pgtz.o -TZDATA := africa antarctica asia australasia europe northamerica southamerica pacificnew etcetera factory backward systemv solar87 solar88 solar89 +# files needed to build zic utility program +ZICOBJS= zic.o ialloc.o scheck.o localtime.o + +# timezone data files +TZDATA := africa antarctica asia australasia europe northamerica southamerica \ + pacificnew etcetera factory backward systemv solar87 solar88 solar89 TZDATAFILES := $(TZDATA:%=data/%) -ifeq ($(USE_PGTZ), yes) all: SUBSYS.o submake-libpgport zic SUBSYS.o: $(OBJS) @@ -31,6 +35,4 @@ install: all installdirs ./zic -d $(DESTDIR)$(datadir)/timezone $(TZDATAFILES) clean distclean maintainer-clean: - rm -f SUBSYS.o $(OBJS) $(ZICOBJS) -endif - + rm -f SUBSYS.o zic $(OBJS) $(ZICOBJS) diff --git a/src/timezone/README b/src/timezone/README index bfea93f1bb..452ecd739c 100644 --- a/src/timezone/README +++ b/src/timezone/README @@ -3,15 +3,3 @@ from: ftp://elsie.nci.nih.gov/pub/tz*.tar.gz -The interface is used when USE_PGTZ is defined at the top level. This -will cause the following functions to be redefined: - localtime pg_localtime - gmtime pg_gmtime - asctime pg_asctime - ctime pg_ctime - difftime pg_difftime - mktime pg_mktime - tzset pg_tzset - -and the TIMEZONE_GLOBAL define in c.h is redefined to pg_timezone. - diff --git a/src/timezone/asctime.c b/src/timezone/asctime.c deleted file mode 100644 index d19e1dc192..0000000000 --- a/src/timezone/asctime.c +++ /dev/null @@ -1,75 +0,0 @@ -#include "pgtz.h" -/* -** This file is in the public domain, so clarified as of -** 1996-06-05 by Arthur David Olson (arthur_david_olson@nih.gov). -*/ - -#ifndef lint -#ifndef NOID -static char elsieid[] = "@(#)asctime.c 7.9"; -#endif /* !defined NOID */ -#endif /* !defined lint */ - -/*LINTLIBRARY*/ - -#include "private.h" -#include "tzfile.h" - -/* -** A la ISO/IEC 9945-1, ANSI/IEEE Std 1003.1, Second Edition, 1996-07-12. -*/ - -char * -asctime_r(timeptr, buf) -register const struct tm * timeptr; -char * buf; -{ - static const char wday_name[][3] = { - "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" - }; - static const char mon_name[][3] = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" - }; - register const char * wn; - register const char * mn; - - if (timeptr->tm_wday < 0 || timeptr->tm_wday >= DAYSPERWEEK) - wn = "???"; - else wn = wday_name[timeptr->tm_wday]; - if (timeptr->tm_mon < 0 || timeptr->tm_mon >= MONSPERYEAR) - mn = "???"; - else mn = mon_name[timeptr->tm_mon]; - /* - ** The X3J11-suggested format is - ** "%.3s %.3s%3d %02.2d:%02.2d:%02.2d %d\n" - ** Since the .2 in 02.2d is ignored, we drop it. - */ - (void) sprintf(buf, "%.3s %.3s%3d %02d:%02d:%02d %d\n", - wn, mn, - timeptr->tm_mday, timeptr->tm_hour, - timeptr->tm_min, timeptr->tm_sec, - TM_YEAR_BASE + timeptr->tm_year); - return buf; -} - -/* -** A la X3J11, with core dump avoidance. -*/ - -char * -asctime(timeptr) -register const struct tm * timeptr; -{ - /* - ** Big enough for something such as - ** ??? ???-2147483648 -2147483648:-2147483648:-2147483648 -2147483648\n - ** (two three-character abbreviations, five strings denoting integers, - ** three explicit spaces, two explicit colons, a newline, - ** and a trailing ASCII nul). - */ - static char result[3 * 2 + 5 * INT_STRLEN_MAXIMUM(int) + - 3 + 2 + 1 + 1]; - - return asctime_r(timeptr, result); -} diff --git a/src/timezone/difftime.c b/src/timezone/difftime.c deleted file mode 100644 index 57b88deafe..0000000000 --- a/src/timezone/difftime.c +++ /dev/null @@ -1,84 +0,0 @@ -#include "pgtz.h" -/* -** This file is in the public domain, so clarified as of -** June 5, 1996 by Arthur David Olson (arthur_david_olson@nih.gov). -*/ - -#ifndef lint -#ifndef NOID -static char elsieid[] = "@(#)difftime.c 7.9"; -#endif /* !defined NOID */ -#endif /* !defined lint */ - -/*LINTLIBRARY*/ - -#include "private.h" - -/* -** Algorithm courtesy Paul Eggert (eggert@twinsun.com). -*/ - -#ifdef HAVE_LONG_DOUBLE -#define long_double long double -#endif /* defined HAVE_LONG_DOUBLE */ -#ifndef HAVE_LONG_DOUBLE -#define long_double double -#endif /* !defined HAVE_LONG_DOUBLE */ - -double -difftime(time1, time0) -const time_t time1; -const time_t time0; -{ - time_t delta; - time_t hibit; - - { - time_t tt; - double d; - long_double ld; - - if (sizeof tt < sizeof d) - return (double) time1 - (double) time0; - if (sizeof tt < sizeof ld) - return (long_double) time1 - (long_double) time0; - } - if (time1 < time0) - return -difftime(time0, time1); - /* - ** As much as possible, avoid loss of precision - ** by computing the difference before converting to double. - */ - delta = time1 - time0; - if (delta >= 0) - return delta; - /* - ** Repair delta overflow. - */ - hibit = (~ (time_t) 0) << (TYPE_BIT(time_t) - 1); - /* - ** The following expression rounds twice, which means - ** the result may not be the closest to the true answer. - ** For example, suppose time_t is 64-bit signed int, - ** long_double is IEEE 754 double with default rounding, - ** time1 = 9223372036854775807 and time0 = -1536. - ** Then the true difference is 9223372036854777343, - ** which rounds to 9223372036854777856 - ** with a total error of 513. - ** But delta overflows to -9223372036854774273, - ** which rounds to -9223372036854774784, and correcting - ** this by subtracting 2 * (long_double) hibit - ** (i.e. by adding 2**64 = 18446744073709551616) - ** yields 9223372036854776832, which - ** rounds to 9223372036854775808 - ** with a total error of 1535 instead. - ** This problem occurs only with very large differences. - ** It's too painful to fix this portably. - ** We are not alone in this problem; - ** some C compilers round twice when converting - ** large unsigned types to small floating types, - ** so if time_t is unsigned the "return delta" above - ** has the same double-rounding problem with those compilers. - */ - return delta - 2 * (long_double) hibit; -} diff --git a/src/timezone/ialloc.c b/src/timezone/ialloc.c index 8a0c701578..b723f932c8 100644 --- a/src/timezone/ialloc.c +++ b/src/timezone/ialloc.c @@ -1,46 +1,30 @@ -#ifndef lint -#ifndef NOID -static char elsieid[] = "@(#)ialloc.c 8.29"; -#endif /* !defined NOID */ -#endif /* !defined lint */ - -/*LINTLIBRARY*/ +#include "postgres.h" #include "private.h" + #define nonzero(n) (((n) == 0) ? 1 : (n)) -char * -imalloc(n) -const int n; +char *imalloc(const int n) { return malloc((size_t) nonzero(n)); } -char * -icalloc(nelem, elsize) -int nelem; -int elsize; +char *icalloc(int nelem, int elsize) { if (nelem == 0 || elsize == 0) nelem = elsize = 1; return calloc((size_t) nelem, (size_t) elsize); } -void * -irealloc(pointer, size) -void * const pointer; -const int size; +void *irealloc(void *pointer, const int size) { if (pointer == NULL) return imalloc(size); return realloc((void *) pointer, (size_t) nonzero(size)); } -char * -icatalloc(old, new) -char * const old; -const char * const new; +char *icatalloc(char *old, const char *new) { register char * result; register int oldsize, newsize; @@ -57,24 +41,18 @@ const char * const new; return result; } -char * -icpyalloc(string) -const char * const string; +char *icpyalloc(const char *string) { return icatalloc((char *) NULL, string); } -void -ifree(p) -char * const p; +void ifree(char *p) { if (p != NULL) (void) free(p); } -void -icfree(p) -char * const p; +void icfree(char *p) { if (p != NULL) (void) free(p); diff --git a/src/timezone/localtime.c b/src/timezone/localtime.c index 6936cd674b..f39049a6af 100644 --- a/src/timezone/localtime.c +++ b/src/timezone/localtime.c @@ -1,41 +1,22 @@ -#include "pgtz.h" -#undef open -#define timezone pg_timezone -#define USG_COMPAT -extern time_t pg_timezone; /* ** This file is in the public domain, so clarified as of ** 1996-06-05 by Arthur David Olson (arthur_david_olson@nih.gov). */ -#ifndef lint -#ifndef NOID -static char elsieid[] = "@(#)localtime.c 7.78"; -#endif /* !defined NOID */ -#endif /* !defined lint */ - /* ** Leap second handling from Bradley White (bww@k.gp.cs.cmu.edu). ** POSIX-style TZ environment variable handling from Guy Harris ** (guy@auspex.com). */ -/*LINTLIBRARY*/ +#include "postgres.h" +#include + +#include "pgtz.h" #include "private.h" #include "tzfile.h" -#include "fcntl.h" -/* -** SunOS 4.1.1 headers lack O_BINARY. -*/ - -#ifdef O_BINARY -#define OPEN_MODE (O_RDONLY | O_BINARY) -#endif /* defined O_BINARY */ -#ifndef O_BINARY -#define OPEN_MODE O_RDONLY -#endif /* !defined O_BINARY */ #ifndef WILDABBR /* @@ -71,9 +52,7 @@ static const char gmt[] = "GMT"; ** implementation dependent; for historical reasons, US rules are a ** common default. */ -#ifndef TZDEFRULESTRING #define TZDEFRULESTRING ",M4.1.0,M10.5.0" -#endif /* !defined TZDEFDST */ struct ttinfo { /* time type information */ long tt_gmtoff; /* UTC offset in seconds */ @@ -90,13 +69,6 @@ struct lsinfo { /* leap second information */ #define BIGGEST(a, b) (((a) > (b)) ? (a) : (b)) -#ifdef TZNAME_MAX -#define MY_TZNAME_MAX TZNAME_MAX -#endif /* defined TZNAME_MAX */ -#ifndef TZNAME_MAX -#define MY_TZNAME_MAX 255 -#endif /* !defined TZNAME_MAX */ - struct state { int leapcnt; int timecnt; @@ -106,7 +78,7 @@ struct state { unsigned char types[TZ_MAX_TIMES]; struct ttinfo ttis[TZ_MAX_TYPES]; char chars[BIGGEST(BIGGEST(TZ_MAX_CHARS + 1, sizeof gmt), - (2 * (MY_TZNAME_MAX + 1)))]; + (2 * (TZ_STRLEN_MAX + 1)))]; struct lsinfo lsis[TZ_MAX_LEAPS]; }; @@ -126,68 +98,34 @@ struct rule { ** Prototypes for static functions. */ -static long detzcode P((const char * codep)); -static const char * getzname P((const char * strp)); -static const char * getnum P((const char * strp, int * nump, int min, - int max)); -static const char * getsecs P((const char * strp, long * secsp)); -static const char * getoffset P((const char * strp, long * offsetp)); -static const char * getrule P((const char * strp, struct rule * rulep)); -static void gmtload P((struct state * sp)); -static void gmtsub P((const time_t * timep, long offset, - struct tm * tmp)); -static void localsub P((const time_t * timep, long offset, - struct tm * tmp)); -static int increment_overflow P((int * number, int delta)); -static int normalize_overflow P((int * tensptr, int * unitsptr, - int base)); -static void settzname P((void)); -static time_t time1 P((struct tm * tmp, - void(*funcp) P((const time_t *, - long, struct tm *)), - long offset)); -static time_t time2 P((struct tm *tmp, - void(*funcp) P((const time_t *, - long, struct tm*)), - long offset, int * okayp)); -static time_t time2sub P((struct tm *tmp, - void(*funcp) P((const time_t *, - long, struct tm*)), - long offset, int * okayp, int do_norm_secs)); -static void timesub P((const time_t * timep, long offset, - const struct state * sp, struct tm * tmp)); -static int tmcomp P((const struct tm * atmp, - const struct tm * btmp)); -static time_t transtime P((time_t janfirst, int year, - const struct rule * rulep, long offset)); -static int tzload P((const char * name, struct state * sp)); -static int tzparse P((const char * name, struct state * sp, - int lastditch)); +static long detzcode(const char *codep); +static const char *getzname(const char *strp); +static const char *getnum(const char *strp, int *nump, int min, int max); +static const char *getsecs(const char *strp, long *secsp); +static const char *getoffset(const char *strp, long *offsetp); +static const char *getrule(const char *strp, struct rule *rulep); +static void gmtload(struct state *sp); +static void gmtsub(const time_t *timep, long offset, struct pg_tm *tmp); +static void localsub(const time_t *timep, long offset, struct pg_tm *tmp); +static int increment_overflow(int *number, int delta); +static int normalize_overflow(int *tensptr, int *unitsptr, int base); +static time_t time1(struct pg_tm *tmp, void(*funcp)(const time_t *, long, struct pg_tm *), long offset); +static time_t time2(struct pg_tm *tmp, void(*funcp)(const time_t *, long, struct pg_tm *), long offset, int *okayp); +static time_t time2sub(struct pg_tm *tmp, void(*funcp)(const time_t *, long, struct pg_tm *), long offset, int *okayp, int do_norm_secs); +static void timesub(const time_t *timep, long offset, const struct state *sp, struct pg_tm *tmp); +static int tmcomp(const struct pg_tm *atmp, const struct pg_tm *btmp); +static time_t transtime(time_t janfirst, int year, const struct rule *rulep, long offset); +static int tzload(const char *name, struct state *sp); +static int tzparse(const char *name, struct state *sp, int lastditch); -#ifdef ALL_STATE -static struct state * lclptr; -static struct state * gmtptr; -#endif /* defined ALL_STATE */ - -#ifndef ALL_STATE static struct state lclmem; static struct state gmtmem; #define lclptr (&lclmem) #define gmtptr (&gmtmem) -#endif /* State Farm */ - -#ifndef TZ_STRLEN_MAX -#define TZ_STRLEN_MAX 255 -#endif /* !defined TZ_STRLEN_MAX */ static char lcl_TZname[TZ_STRLEN_MAX + 1]; -static int lcl_is_set; -static int gmt_is_set; - -char * tzname[2] = { - wildabbr, - wildabbr -}; +static int lcl_is_set=0; +static int gmt_is_set=0; /* ** Section 4.12.3 of X3.159-1989 requires that @@ -197,20 +135,10 @@ char * tzname[2] = { ** Thanks to Paul Eggert (eggert@twinsun.com) for noting this. */ -static struct tm tm; +static struct pg_tm tm; -#ifdef USG_COMPAT -time_t timezone = 0; -int daylight = 0; -#endif /* defined USG_COMPAT */ -#ifdef ALTZONE -time_t altzone = 0; -#endif /* defined ALTZONE */ - -static long -detzcode(codep) -const char * const codep; +static long detzcode(const char *codep) { register long result; register int i; @@ -221,60 +149,7 @@ const char * const codep; return result; } -static void -settzname P((void)) -{ - register struct state * const sp = lclptr; - register int i; - - tzname[0] = wildabbr; - tzname[1] = wildabbr; -#ifdef USG_COMPAT - daylight = 0; - timezone = 0; -#endif /* defined USG_COMPAT */ -#ifdef ALTZONE - altzone = 0; -#endif /* defined ALTZONE */ -#ifdef ALL_STATE - if (sp == NULL) { - tzname[0] = tzname[1] = gmt; - return; - } -#endif /* defined ALL_STATE */ - for (i = 0; i < sp->typecnt; ++i) { - register const struct ttinfo * const ttisp = &sp->ttis[i]; - - tzname[ttisp->tt_isdst] = - &sp->chars[ttisp->tt_abbrind]; -#ifdef USG_COMPAT - if (ttisp->tt_isdst) - daylight = 1; - if (i == 0 || !ttisp->tt_isdst) - timezone = -(ttisp->tt_gmtoff); -#endif /* defined USG_COMPAT */ -#ifdef ALTZONE - if (i == 0 || ttisp->tt_isdst) - altzone = -(ttisp->tt_gmtoff); -#endif /* defined ALTZONE */ - } - /* - ** And to get the latest zone names into tzname. . . - */ - for (i = 0; i < sp->timecnt; ++i) { - register const struct ttinfo * const ttisp = - &sp->ttis[ - sp->types[i]]; - - tzname[ttisp->tt_isdst] = - &sp->chars[ttisp->tt_abbrind]; - } -} - -static int -tzload(name, sp) -register const char * name; -register struct state * const sp; +static int tzload(register const char *name, register struct state *sp) { register const char * p; register int i; @@ -284,20 +159,14 @@ register struct state * const sp; return -1; { register int doaccess; - /* - ** Section 4.9.1 of the C standard says that - ** "FILENAME_MAX expands to an integral constant expression - ** that is the size needed for an array of char large enough - ** to hold the longest file name string that the implementation - ** guarantees can be opened." - */ - char fullname[FILENAME_MAX + 1]; + char fullname[MAXPGPATH]; if (name[0] == ':') ++name; doaccess = name[0] == '/'; if (!doaccess) { - if ((p = TZDIR) == NULL) + p = pg_TZDIR(); + if (p == NULL) return -1; if ((strlen(p) + strlen(name) + 1) >= sizeof fullname) return -1; @@ -313,7 +182,7 @@ register struct state * const sp; } if (doaccess && access(name, R_OK) != 0) return -1; - if ((fid = open(name, OPEN_MODE)) == -1) + if ((fid = open(name, O_RDONLY | PG_BINARY)) == -1) return -1; } { @@ -430,9 +299,7 @@ static const int year_lengths[2] = { ** character. */ -static const char * -getzname(strp) -register const char * strp; +static const char *getzname(register const char *strp) { register char c; @@ -449,12 +316,7 @@ register const char * strp; ** Otherwise, return a pointer to the first character not part of the number. */ -static const char * -getnum(strp, nump, min, max) -register const char * strp; -int * const nump; -const int min; -const int max; +static const char *getnum(register const char *strp, int *nump, const int min, const int max) { register char c; register int num; @@ -482,10 +344,7 @@ const int max; ** of seconds. */ -static const char * -getsecs(strp, secsp) -register const char * strp; -long * const secsp; +static const char *getsecs(register const char *strp, long *secsp) { int num; @@ -524,10 +383,7 @@ long * const secsp; ** Otherwise, return a pointer to the first character not part of the time. */ -static const char * -getoffset(strp, offsetp) -register const char * strp; -long * const offsetp; +static const char *getoffset(register const char *strp, long *offsetp) { register int neg = 0; @@ -551,10 +407,7 @@ long * const offsetp; ** Otherwise, return a pointer to the first character not part of the rule. */ -static const char * -getrule(strp, rulep) -const char * strp; -register struct rule * const rulep; +static const char *getrule(const char *strp, register struct rule *rulep) { if (*strp == 'J') { /* @@ -605,19 +458,13 @@ register struct rule * const rulep; ** calculate the Epoch-relative time that rule takes effect. */ -static time_t -transtime(janfirst, year, rulep, offset) -const time_t janfirst; -const int year; -register const struct rule * const rulep; -const long offset; +static time_t transtime(const time_t janfirst, const int year, register const struct rule *rulep, const long offset) { register int leapyear; - register time_t value; + register time_t value = 0; register int i; int d, m1, yy0, yy1, yy2, dow; - INITIALIZE(value); leapyear = isleap(year); switch (rulep->r_type) { @@ -700,14 +547,10 @@ const long offset; ** appropriate. */ -static int -tzparse(name, sp, lastditch) -const char * name; -register struct state * const sp; -const int lastditch; +static int tzparse(const char *name, register struct state *sp, const int lastditch) { const char * stdname; - const char * dstname; + const char * dstname = NULL; size_t stdlen; size_t dstlen; long stdoffset; @@ -717,7 +560,6 @@ const int lastditch; register char * cp; register int load_result; - INITIALIZE(dstname); stdname = name; if (lastditch) { stdlen = strlen(name); /* length of standard zone name */ @@ -913,83 +755,33 @@ const int lastditch; return 0; } -static void -gmtload(sp) -struct state * const sp; +static void gmtload(struct state *sp) { if (tzload(gmt, sp) != 0) (void) tzparse(gmt, sp, TRUE); } -#ifndef STD_INSPIRED -/* -** A non-static declaration of tzsetwall in a system header file -** may cause a warning about this upcoming static declaration... -*/ -static -#endif /* !defined STD_INSPIRED */ -void -tzsetwall P((void)) + +bool pg_tzset(const char *name) { - if (lcl_is_set < 0) - return; - lcl_is_set = -1; + if (lcl_is_set && strcmp(lcl_TZname, name) == 0) + return true; /* no change */ -#ifdef ALL_STATE - if (lclptr == NULL) { - lclptr = (struct state *) malloc(sizeof *lclptr); - if (lclptr == NULL) { - settzname(); /* all we can do */ - return; - } - } -#endif /* defined ALL_STATE */ - if (tzload((char *) NULL, lclptr) != 0) - gmtload(lclptr); - settzname(); -} + if (strlen(name) >= sizeof(lcl_TZname)) + return false; /* not gonna fit */ -void -tzset P((void)) -{ - register const char * name; - - name = getenv("TZ"); - if (name == NULL) { - tzsetwall(); - return; - } - - if (lcl_is_set > 0 && strcmp(lcl_TZname, name) == 0) - return; - lcl_is_set = strlen(name) < sizeof lcl_TZname; - if (lcl_is_set) - (void) strcpy(lcl_TZname, name); - -#ifdef ALL_STATE - if (lclptr == NULL) { - lclptr = (struct state *) malloc(sizeof *lclptr); - if (lclptr == NULL) { - settzname(); /* all we can do */ - return; - } - } -#endif /* defined ALL_STATE */ - if (*name == '\0') { - /* - ** User wants it fast rather than right. - */ - lclptr->leapcnt = 0; /* so, we're off a little */ - lclptr->timecnt = 0; - lclptr->typecnt = 0; - lclptr->ttis[0].tt_isdst = 0; - lclptr->ttis[0].tt_gmtoff = 0; - lclptr->ttis[0].tt_abbrind = 0; - (void) strcpy(lclptr->chars, gmt); - } else if (tzload(name, lclptr) != 0) + if (tzload(name, lclptr) != 0) { if (name[0] == ':' || tzparse(name, lclptr, FALSE) != 0) - (void) gmtload(lclptr); - settzname(); + { + /* Unknown timezone. Fail our call instead of loading GMT! */ + return false; + } + } + + strcpy(lcl_TZname, name); + lcl_is_set = true; + + return true; } /* @@ -1001,12 +793,7 @@ tzset P((void)) ** The unused offset argument is for the benefit of mktime variants. */ -/*ARGSUSED*/ -static void -localsub(timep, offset, tmp) -const time_t * const timep; -const long offset; -struct tm * const tmp; +static void localsub(const time_t *timep, const long offset, struct pg_tm *tmp) { register struct state * sp; register const struct ttinfo * ttisp; @@ -1014,12 +801,6 @@ struct tm * const tmp; const time_t t = *timep; sp = lclptr; -#ifdef ALL_STATE - if (sp == NULL) { - gmtsub(timep, offset, tmp); - return; - } -#endif /* defined ALL_STATE */ if (sp->timecnt == 0 || t < sp->ats[0]) { i = 0; while (sp->ttis[i].tt_isdst) @@ -1029,7 +810,7 @@ struct tm * const tmp; } } else { for (i = 1; i < sp->timecnt; ++i) - if (t < sp->ats[i]) + if (t < sp->ats[i]) break; i = sp->types[i - 1]; } @@ -1042,114 +823,47 @@ struct tm * const tmp; */ timesub(&t, ttisp->tt_gmtoff, sp, tmp); tmp->tm_isdst = ttisp->tt_isdst; - tzname[tmp->tm_isdst] = &sp->chars[ttisp->tt_abbrind]; -#ifdef TM_ZONE - tmp->TM_ZONE = &sp->chars[ttisp->tt_abbrind]; -#endif /* defined TM_ZONE */ + tmp->tm_zone = &sp->chars[ttisp->tt_abbrind]; } -struct tm * -localtime(timep) -const time_t * const timep; +struct pg_tm *pg_localtime(const time_t *timep) { - tzset(); localsub(timep, 0L, &tm); return &tm; } -/* -** Re-entrant version of localtime. -*/ - -struct tm * -localtime_r(timep, tm) -const time_t * const timep; -struct tm * tm; -{ - localsub(timep, 0L, tm); - return tm; -} /* ** gmtsub is to gmtime as localsub is to localtime. */ -static void -gmtsub(timep, offset, tmp) -const time_t * const timep; -const long offset; -struct tm * const tmp; +static void gmtsub(const time_t *timep, const long offset, struct pg_tm *tmp) { if (!gmt_is_set) { gmt_is_set = TRUE; -#ifdef ALL_STATE - gmtptr = (struct state *) malloc(sizeof *gmtptr); - if (gmtptr != NULL) -#endif /* defined ALL_STATE */ - gmtload(gmtptr); + gmtload(gmtptr); } timesub(timep, offset, gmtptr, tmp); -#ifdef TM_ZONE /* ** Could get fancy here and deliver something such as ** "UTC+xxxx" or "UTC-xxxx" if offset is non-zero, ** but this is no time for a treasure hunt. */ if (offset != 0) - tmp->TM_ZONE = wildabbr; + tmp->tm_zone = wildabbr; else { -#ifdef ALL_STATE - if (gmtptr == NULL) - tmp->TM_ZONE = gmt; - else tmp->TM_ZONE = gmtptr->chars; -#endif /* defined ALL_STATE */ -#ifndef ALL_STATE - tmp->TM_ZONE = gmtptr->chars; -#endif /* State Farm */ + tmp->tm_zone = gmtptr->chars; } -#endif /* defined TM_ZONE */ } -struct tm * -gmtime(timep) -const time_t * const timep; +struct pg_tm *pg_gmtime(const time_t *timep) { gmtsub(timep, 0L, &tm); return &tm; } -/* -* Re-entrant version of gmtime. -*/ -struct tm * -gmtime_r(timep, tm) -const time_t * const timep; -struct tm * tm; -{ - gmtsub(timep, 0L, tm); - return tm; -} - -#ifdef STD_INSPIRED - -struct tm * -offtime(timep, offset) -const time_t * const timep; -const long offset; -{ - gmtsub(timep, offset, &tm); - return &tm; -} - -#endif /* defined STD_INSPIRED */ - -static void -timesub(timep, offset, sp, tmp) -const time_t * const timep; -const long offset; -register const struct state * const sp; -register struct tm * const tmp; +static void timesub(const time_t *timep, const long offset, register const struct state *sp, register struct pg_tm *tmp) { register const struct lsinfo * lp; register long days; @@ -1163,12 +877,7 @@ register struct tm * const tmp; corr = 0; hit = 0; -#ifdef ALL_STATE - i = (sp == NULL) ? 0 : sp->leapcnt; -#endif /* defined ALL_STATE */ -#ifndef ALL_STATE i = sp->leapcnt; -#endif /* State Farm */ while (--i >= 0) { lp = &sp->lsis[i]; if (*timep >= lp->ls_trans) { @@ -1240,32 +949,7 @@ register struct tm * const tmp; days = days - (long) ip[tmp->tm_mon]; tmp->tm_mday = (int) (days + 1); tmp->tm_isdst = 0; -#ifdef TM_GMTOFF - tmp->TM_GMTOFF = offset; -#endif /* defined TM_GMTOFF */ -} - -char * -ctime(timep) -const time_t * const timep; -{ -/* -** Section 4.12.3.2 of X3.159-1989 requires that -** The ctime function converts the calendar time pointed to by timer -** to local time in the form of a string. It is equivalent to -** asctime(localtime(timer)) -*/ - return asctime(localtime(timep)); -} - -char * -ctime_r(timep, buf) -const time_t * const timep; -char * buf; -{ - struct tm tm; - - return asctime_r(localtime_r(timep, &tm), buf); + tmp->tm_gmtoff = offset; } /* @@ -1278,18 +962,13 @@ char * buf; ** would still be very reasonable). */ -#ifndef WRONG #define WRONG (-1) -#endif /* !defined WRONG */ /* ** Simplified normalize logic courtesy Paul Eggert (eggert@twinsun.com). */ -static int -increment_overflow(number, delta) -int * number; -int delta; +static int increment_overflow(int *number, int delta) { int number0; @@ -1298,11 +977,7 @@ int delta; return (*number < number0) != (delta < 0); } -static int -normalize_overflow(tensptr, unitsptr, base) -int * const tensptr; -int * const unitsptr; -const int base; +static int normalize_overflow(int *tensptr, int *unitsptr, const int base) { register int tensdelta; @@ -1313,10 +988,7 @@ const int base; return increment_overflow(tensptr, tensdelta); } -static int -tmcomp(atmp, btmp) -register const struct tm * const atmp; -register const struct tm * const btmp; +static int tmcomp(register const struct pg_tm *atmp, register const struct pg_tm *btmp) { register int result; @@ -1329,13 +1001,7 @@ register const struct tm * const btmp; return result; } -static time_t -time2sub(tmp, funcp, offset, okayp, do_norm_secs) -struct tm * const tmp; -void (* const funcp) P((const time_t*, long, struct tm*)); -const long offset; -int * const okayp; -const int do_norm_secs; +static time_t time2sub(struct pg_tm *tmp, void(*funcp)(const time_t *, long, struct pg_tm *), const long offset, int *okayp, const int do_norm_secs) { register const struct state * sp; register int dir; @@ -1344,7 +1010,7 @@ const int do_norm_secs; register int saved_seconds; time_t newt; time_t t; - struct tm yourtm, mytm; + struct pg_tm yourtm, mytm; *okayp = FALSE; yourtm = *tmp; @@ -1447,10 +1113,6 @@ const int do_norm_secs; sp = (const struct state *) (((void *) funcp == (void *) localsub) ? lclptr : gmtptr); -#ifdef ALL_STATE - if (sp == NULL) - return WRONG; -#endif /* defined ALL_STATE */ for (i = sp->typecnt - 1; i >= 0; --i) { if (sp->ttis[i].tt_isdst != yourtm.tm_isdst) continue; @@ -1483,12 +1145,7 @@ label: return t; } -static time_t -time2(tmp, funcp, offset, okayp) -struct tm * const tmp; -void (* const funcp) P((const time_t*, long, struct tm*)); -const long offset; -int * const okayp; +static time_t time2(struct pg_tm *tmp, void(*funcp)(const time_t*, long, struct pg_tm*), const long offset, int *okayp) { time_t t; @@ -1501,11 +1158,7 @@ int * const okayp; return *okayp ? t : time2sub(tmp, funcp, offset, okayp, TRUE); } -static time_t -time1(tmp, funcp, offset) -struct tm * const tmp; -void (* const funcp) P((const time_t *, long, struct tm *)); -const long offset; +static time_t time1(struct pg_tm *tmp, void (*funcp)(const time_t *, long, struct pg_tm *), const long offset) { register time_t t; register const struct state * sp; @@ -1520,22 +1173,11 @@ const long offset; if (tmp->tm_isdst > 1) tmp->tm_isdst = 1; t = time2(tmp, funcp, offset, &okay); -#ifdef PCTS - /* - ** PCTS code courtesy Grant Sullivan (grant@osf.org). - */ - if (okay) - return t; - if (tmp->tm_isdst < 0) - tmp->tm_isdst = 0; /* reset to std and try again */ -#endif /* defined PCTS */ -#ifndef PCTS if (okay || tmp->tm_isdst < 0) return t; -#endif /* !defined PCTS */ /* ** We're supposed to assume that somebody took a time of one type - ** and did some math on it that yielded a "struct tm" that's bad. + ** and did some math on it that yielded a "struct pg_tm" that's bad. ** We try to divine the type they started from and adjust to the ** type they need. */ @@ -1544,10 +1186,6 @@ const long offset; */ sp = (const struct state *) (((void *) funcp == (void *) localsub) ? lclptr : gmtptr); -#ifdef ALL_STATE - if (sp == NULL) - return WRONG; -#endif /* defined ALL_STATE */ for (i = 0; i < sp->typecnt; ++i) seen[i] = FALSE; nseen = 0; @@ -1578,135 +1216,17 @@ const long offset; return WRONG; } -time_t -mktime(tmp) -struct tm * const tmp; +time_t pg_mktime(struct pg_tm *tmp) { - tzset(); return time1(tmp, localsub, 0L); } -#ifdef STD_INSPIRED - -time_t -timelocal(tmp) -struct tm * const tmp; -{ - tmp->tm_isdst = -1; /* in case it wasn't initialized */ - return mktime(tmp); -} - -time_t -timegm(tmp) -struct tm * const tmp; -{ - tmp->tm_isdst = 0; - return time1(tmp, gmtsub, 0L); -} - -time_t -timeoff(tmp, offset) -struct tm * const tmp; -const long offset; -{ - tmp->tm_isdst = 0; - return time1(tmp, gmtsub, offset); -} - -#endif /* defined STD_INSPIRED */ - -#ifdef CMUCS - /* -** The following is supplied for compatibility with -** previous versions of the CMUCS runtime library. -*/ - -long -gtime(tmp) -struct tm * const tmp; -{ - const time_t t = mktime(tmp); - - if (t == WRONG) - return -1; - return t; + * Return the name of the current timezone + */ +const char * +pg_get_current_timezone(void) { + if (lcl_is_set) + return lcl_TZname; + return NULL; } - -#endif /* defined CMUCS */ - -/* -** XXX--is the below the right way to conditionalize?? -*/ - -#ifdef STD_INSPIRED - -/* -** IEEE Std 1003.1-1988 (POSIX) legislates that 536457599 -** shall correspond to "Wed Dec 31 23:59:59 UTC 1986", which -** is not the case if we are accounting for leap seconds. -** So, we provide the following conversion routines for use -** when exchanging timestamps with POSIX conforming systems. -*/ - -static long -leapcorr(timep) -time_t * timep; -{ - register struct state * sp; - register struct lsinfo * lp; - register int i; - - sp = lclptr; - i = sp->leapcnt; - while (--i >= 0) { - lp = &sp->lsis[i]; - if (*timep >= lp->ls_trans) - return lp->ls_corr; - } - return 0; -} - -time_t -time2posix(t) -time_t t; -{ - tzset(); - return t - leapcorr(&t); -} - -time_t -posix2time(t) -time_t t; -{ - time_t x; - time_t y; - - tzset(); - /* - ** For a positive leap second hit, the result - ** is not unique. For a negative leap second - ** hit, the corresponding time doesn't exist, - ** so we return an adjacent second. - */ - x = t + leapcorr(&t); - y = x - leapcorr(&x); - if (y < t) { - do { - x++; - y = x - leapcorr(&x); - } while (y < t); - if (t != y) - return x - 1; - } else if (y > t) { - do { - --x; - y = x - leapcorr(&x); - } while (y > t); - if (t != y) - return x + 1; - } - return x; -} - -#endif /* defined STD_INSPIRED */ diff --git a/src/timezone/pgtz.c b/src/timezone/pgtz.c index c51e3b0382..5356f40e3c 100644 --- a/src/timezone/pgtz.c +++ b/src/timezone/pgtz.c @@ -6,13 +6,22 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * * IDENTIFICATION - * $PostgreSQL: pgsql/src/timezone/pgtz.c,v 1.9 2004/05/18 03:36:45 momjian Exp $ + * $PostgreSQL: pgsql/src/timezone/pgtz.c,v 1.10 2004/05/21 05:08:06 tgl Exp $ * *------------------------------------------------------------------------- */ +#define NO_REDEFINE_TIMEFUNCS +#include "postgres.h" + +#include + +#include "miscadmin.h" +#include "pgtime.h" #include "pgtz.h" #include "tzfile.h" +#include "utils/elog.h" +#include "utils/guc.h" static char tzdir[MAXPGPATH]; @@ -30,3 +39,255 @@ pg_TZDIR(void) done_tzdir = 1; return tzdir; } + +/* + * Try to determine the system timezone (as opposed to the timezone + * set in our own library). + */ +#define T_YEAR (60*60*24*365) +#define T_MONTH (60*60*24*30) + +struct tztry { + time_t std_t,dst_t; + char std_time[TZ_STRLEN_MAX+1],dst_time[TZ_STRLEN_MAX+1]; + int std_ofs,dst_ofs; + struct tm std_tm, dst_tm; +}; + + +static bool compare_tm(struct tm *s, struct pg_tm *p) { + if (s->tm_sec != p->tm_sec || + s->tm_min != p->tm_min || + s->tm_hour != p->tm_hour || + s->tm_mday != p->tm_mday || + s->tm_mon != p->tm_mon || + s->tm_year != p->tm_year || + s->tm_wday != p->tm_wday || + s->tm_yday != p->tm_yday || + s->tm_isdst != p->tm_isdst) + return false; + return true; +} + +static bool try_timezone(char *tzname, struct tztry *tt, bool checkdst) { + struct pg_tm *pgtm; + + if (!pg_tzset(tzname)) + return false; /* If this timezone couldn't be picked at all */ + + /* Verify standard time */ + pgtm = pg_localtime(&(tt->std_t)); + if (!pgtm) + return false; + if (!compare_tm(&(tt->std_tm), pgtm)) + return false; + + if (!checkdst) + return true; + + /* Now check daylight time */ + pgtm = pg_localtime(&(tt->dst_t)); + if (!pgtm) + return false; + if (!compare_tm(&(tt->dst_tm), pgtm)) + return false; + + return true; +} + +static int get_timezone_offset(struct tm *tm) { +#if defined(HAVE_STRUCT_TM_TM_ZONE) + return tm->tm_gmtoff; +#elif defined(HAVE_INT_TIMEZONE) +#ifdef HAVE_UNDERSCORE_TIMEZONE + return -_timezone; +#else + return -timezone; +#endif +#else +#error No way to determine TZ? Can this happen? +#endif +} + + +#ifdef WIN32 +#define TZABBREV(tz) win32_get_timezone_abbrev(tz) + +static char *win32_get_timezone_abbrev(char *tz) { + static char w32tzabbr[TZ_STRLEN_MAX+1]; + int l = 0; + char *c; + + for (c = tz; *c; c++) { + if (isupper(*c)) + w32tzabbr[l++] = *c; + } + w32tzabbr[l] = '\0'; + return w32tzabbr; +} + +#else +#define TZABBREV(tz) tz +#endif + + +/* + * Try to identify a timezone name (in our terminology) that matches the + * observed behavior of the system timezone library. We cannot assume that + * the system TZ environment setting (if indeed there is one) matches our + * terminology, so ignore it and just look at what localtime() returns. + */ +static char * +identify_system_timezone(void) +{ + static char __tzbuf[TZ_STRLEN_MAX+1]; + bool std_found=false, + dst_found=false; + time_t tnow = time(NULL); + time_t t; + struct tztry tt; + char cbuf[TZ_STRLEN_MAX+1]; + + /* Initialize OS timezone library */ + tzset(); + + memset(&tt, 0, sizeof(tt)); + + for (t = tnow; t < tnow+T_YEAR; t += T_MONTH) { + struct tm *tm = localtime(&t); + + if (tm->tm_isdst == 0 && !std_found) { + /* Standard time */ + memcpy(&tt.std_tm, tm, sizeof(struct tm)); + memset(cbuf,0,sizeof(cbuf)); + strftime(cbuf, sizeof(cbuf)-1, "%Z", tm); /* zone abbr */ + strcpy(tt.std_time, TZABBREV(cbuf)); + tt.std_ofs = get_timezone_offset(tm); + tt.std_t = t; + std_found = true; + } + else if (tm->tm_isdst == 1 && !dst_found) { + /* Daylight time */ + memcpy(&tt.dst_tm, tm, sizeof(struct tm)); + memset(cbuf,0,sizeof(cbuf)); + strftime(cbuf, sizeof(cbuf)-1, "%Z", tm); /* zone abbr */ + strcpy(tt.dst_time, TZABBREV(cbuf)); + tt.dst_ofs = get_timezone_offset(tm); + tt.dst_t = t; + dst_found = true; + } + if (std_found && dst_found) + break; /* Got both standard and daylight */ + } + + if (!std_found) + { + /* Failed to determine TZ! */ + ereport(LOG, + (errmsg("unable to determine system timezone, defaulting to \"%s\"", "GMT"), + errhint("You can specify the correct timezone in postgresql.conf."))); + return NULL; /* go to GMT */ + } + + if (dst_found) { + /* Try STDDST */ + sprintf(__tzbuf,"%s%d%s",tt.std_time,-tt.std_ofs/3600,tt.dst_time); + if (try_timezone(__tzbuf, &tt, dst_found)) + return __tzbuf; + } + /* Try just the STD timezone */ + strcpy(__tzbuf,tt.std_time); + if (try_timezone(__tzbuf, &tt, dst_found)) + return __tzbuf; + + /* Did not find the timezone. Fallback to try a GMT zone. */ + sprintf(__tzbuf,"Etc/GMT%s%d", + (-tt.std_ofs<0)?"+":"",tt.std_ofs/3600); + ereport(LOG, + (errmsg("could not recognize system timezone, defaulting to \"%s\"", + __tzbuf), + errhint("You can specify the correct timezone in postgresql.conf."))); + return __tzbuf; +} + +/* + * Check whether timezone is acceptable. + * + * What we are doing here is checking for leap-second-aware timekeeping. + * We need to reject such TZ settings because they'll wreak havoc with our + * date/time arithmetic. + * + * NB: this must NOT ereport(ERROR). The caller must get control back so that + * it can restore the old value of TZ if we don't like the new one. + */ +bool +tz_acceptable(void) +{ + struct pg_tm tt; + time_t time2000; + + /* + * To detect leap-second timekeeping, compute the time_t value for + * local midnight, 2000-01-01. Insist that this be a multiple of 60; + * any partial-minute offset has to be due to leap seconds. + */ + MemSet(&tt, 0, sizeof(tt)); + tt.tm_year = 100; + tt.tm_mon = 0; + tt.tm_mday = 1; + tt.tm_isdst = -1; + time2000 = pg_mktime(&tt); + if ((time2000 % 60) != 0) + return false; + + return true; +} + +/* + * Identify a suitable default timezone setting based on the environment, + * and make it active. + * + * We first look to the TZ environment variable. If not found or not + * recognized by our own code, we see if we can identify the timezone + * from the behavior of the system timezone library. When all else fails, + * fall back to GMT. + */ +const char * +select_default_timezone(void) +{ + char *def_tz; + + def_tz = getenv("TZ"); + if (def_tz && pg_tzset(def_tz) && tz_acceptable()) + return def_tz; + + def_tz = identify_system_timezone(); + if (def_tz && pg_tzset(def_tz) && tz_acceptable()) + return def_tz; + + if (pg_tzset("GMT") && tz_acceptable()) + return "GMT"; + + ereport(FATAL, + (errmsg("could not select a suitable default timezone"), + errdetail("It appears that your GMT time zone uses leap seconds. PostgreSQL does not support leap seconds."))); + return NULL; /* keep compiler quiet */ +} + +/* + * Initialize timezone library + * + * This is called after initial loading of postgresql.conf. If no TimeZone + * setting was found therein, we try to derive one from the environment. + */ +void pg_timezone_initialize(void) { + /* Do we need to try to figure the timezone? */ + if (strcmp(GetConfigOption("timezone"), "UNKNOWN") == 0) { + const char *def_tz; + + /* Select setting */ + def_tz = select_default_timezone(); + /* Tell GUC about the value. Will redundantly call pg_tzset() */ + SetConfigOption("timezone", def_tz, PGC_POSTMASTER, PGC_S_ENV_VAR); + } +} diff --git a/src/timezone/pgtz.h b/src/timezone/pgtz.h index 7129bff6ea..09da7ab180 100644 --- a/src/timezone/pgtz.h +++ b/src/timezone/pgtz.h @@ -1,12 +1,23 @@ -#include "postgres.h" -#include "miscadmin.h" +/*------------------------------------------------------------------------- + * + * pgtz.h + * Timezone Library Integration Functions + * + * Note: this file contains only definitions that are private to the + * timezone library. Public definitions are in pgtime.h. + * + * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group + * + * IDENTIFICATION + * $PostgreSQL: pgsql/src/timezone/pgtz.h,v 1.7 2004/05/21 05:08:06 tgl Exp $ + * + *------------------------------------------------------------------------- + */ +#ifndef _PGTZ_H +#define _PGTZ_H -#ifndef HAVE_SYMLINK -#define HAVE_SYMLINK 0 -#endif +#define TZ_STRLEN_MAX 255 +extern char *pg_TZDIR(void); -#define NOID -#define TZDIR pg_TZDIR() - -char *pg_TZDIR(void); +#endif /* _PGTZ_H */ diff --git a/src/timezone/private.h b/src/timezone/private.h index d71c58b6ac..f9ba3bae5d 100644 --- a/src/timezone/private.h +++ b/src/timezone/private.h @@ -1,5 +1,4 @@ #ifndef PRIVATE_H - #define PRIVATE_H /* @@ -15,94 +14,12 @@ ** Thank you! */ -/* -** ID -*/ - -#ifndef lint -#ifndef NOID -static char privatehid[] = "@(#)private.h 7.53"; -#endif /* !defined NOID */ -#endif /* !defined lint */ - -/* -** Defaults for preprocessor symbols. -** You can override these in your C compiler options, e.g. `-DHAVE_ADJTIME=0'. -*/ - -#ifndef HAVE_ADJTIME -#define HAVE_ADJTIME 1 -#endif /* !defined HAVE_ADJTIME */ - -#ifndef HAVE_GETTEXT -#define HAVE_GETTEXT 0 -#endif /* !defined HAVE_GETTEXT */ - -#ifndef HAVE_INCOMPATIBLE_CTIME_R -#define HAVE_INCOMPATIBLE_CTIME_R 0 -#endif /* !defined INCOMPATIBLE_CTIME_R */ - -#ifndef HAVE_SETTIMEOFDAY -#define HAVE_SETTIMEOFDAY 3 -#endif /* !defined HAVE_SETTIMEOFDAY */ - -#ifndef HAVE_STRERROR -#define HAVE_STRERROR 1 -#endif /* !defined HAVE_STRERROR */ - -#ifndef HAVE_SYMLINK -#define HAVE_SYMLINK 1 -#endif /* !defined HAVE_SYMLINK */ - -#ifndef HAVE_SYS_STAT_H -#define HAVE_SYS_STAT_H 1 -#endif /* !defined HAVE_SYS_STAT_H */ - -#ifndef HAVE_SYS_WAIT_H -#define HAVE_SYS_WAIT_H 1 -#endif /* !defined HAVE_SYS_WAIT_H */ - -#ifndef HAVE_UNISTD_H -#define HAVE_UNISTD_H 1 -#endif /* !defined HAVE_UNISTD_H */ - -#ifndef HAVE_UTMPX_H -#define HAVE_UTMPX_H 0 -#endif /* !defined HAVE_UTMPX_H */ - -#ifndef LOCALE_HOME -#define LOCALE_HOME "/usr/lib/locale" -#endif /* !defined LOCALE_HOME */ - -#if HAVE_INCOMPATIBLE_CTIME_R -#define asctime_r _incompatible_asctime_r -#define ctime_r _incompatible_ctime_r -#endif /* HAVE_INCOMPATIBLE_CTIME_R */ - -/* -** Nested includes -*/ - -#include "sys/types.h" /* for time_t */ -#include "stdio.h" -#include "errno.h" -#include "string.h" -#include "limits.h" /* for CHAR_BIT */ - -#define save_timezone pg_timezone -#undef timezone -#include "time.h" -#define timezone save_timezone - -#include "stdlib.h" - -#if HAVE_GETTEXT - 0 -#include "libintl.h" -#endif /* HAVE_GETTEXT - 0 */ - -#if HAVE_SYS_WAIT_H - 0 +#include /* for CHAR_BIT */ #include /* for WIFEXITED and WEXITSTATUS */ -#endif /* HAVE_SYS_WAIT_H - 0 */ +#include /* for F_OK and R_OK */ + +#include "pgtime.h" + #ifndef WIFEXITED #define WIFEXITED(status) (((status) & 0xff) == 0) @@ -111,39 +28,9 @@ static char privatehid[] = "@(#)private.h 7.53"; #define WEXITSTATUS(status) (((status) >> 8) & 0xff) #endif /* !defined WEXITSTATUS */ -#if HAVE_UNISTD_H - 0 -#include "unistd.h" /* for F_OK and R_OK */ -#endif /* HAVE_UNISTD_H - 0 */ - -#if !(HAVE_UNISTD_H - 0) -#ifndef F_OK -#define F_OK 0 -#endif /* !defined F_OK */ -#ifndef R_OK -#define R_OK 4 -#endif /* !defined R_OK */ -#endif /* !(HAVE_UNISTD_H - 0) */ - /* Unlike 's isdigit, this also works if c < 0 | c > UCHAR_MAX. */ #define is_digit(c) ((unsigned)(c) - '0' <= 9) -/* -** Workarounds for compilers/systems. -*/ - -/* -** SunOS 4.1.1 cc lacks prototypes. -*/ - -#ifndef P -#ifdef __STDC__ -#define P(x) x -#endif /* defined __STDC__ */ -#ifndef __STDC__ -#define P(x) () -#endif /* !defined __STDC__ */ -#endif /* !defined P */ - /* ** SunOS 4.1.1 headers lack EXIT_SUCCESS. */ @@ -160,61 +47,31 @@ static char privatehid[] = "@(#)private.h 7.53"; #define EXIT_FAILURE 1 #endif /* !defined EXIT_FAILURE */ -/* -** SunOS 4.1.1 headers lack FILENAME_MAX. -*/ - -#ifndef FILENAME_MAX - -#ifndef MAXPATHLEN -#ifdef unix -#include "sys/param.h" -#endif /* defined unix */ -#endif /* !defined MAXPATHLEN */ - -#ifdef MAXPATHLEN -#define FILENAME_MAX MAXPATHLEN -#endif /* defined MAXPATHLEN */ -#ifndef MAXPATHLEN -#define FILENAME_MAX 1024 /* Pure guesswork */ -#endif /* !defined MAXPATHLEN */ - -#endif /* !defined FILENAME_MAX */ - /* ** SunOS 4.1.1 libraries lack remove. */ #ifndef remove -extern int unlink P((const char * filename)); +extern int unlink (const char * filename); #define remove unlink #endif /* !defined remove */ /* -** Some ancient errno.h implementations don't declare errno. -** But some newer errno.h implementations define it as a macro. -** Fix the former without affecting the latter. -*/ -#ifndef errno -extern int errno; -#endif /* !defined errno */ - -/* -** Private function declarations. -*/ -char * icalloc P((int nelem, int elsize)); -char * icatalloc P((char * old, const char * new)); -char * icpyalloc P((const char * string)); -char * imalloc P((int n)); -void * irealloc P((void * pointer, int size)); -void icfree P((char * pointer)); -void ifree P((char * pointer)); -char * scheck P((const char *string, const char *format)); + * Private function declarations. + */ +extern char *icalloc (int nelem, int elsize); +extern char *icatalloc (char *old, const char *new); +extern char *icpyalloc (const char *string); +extern char *imalloc (int n); +extern void *irealloc (void *pointer, int size); +extern void icfree (char *pointer); +extern void ifree (char *pointer); +extern char *scheck (const char *string, const char *format); /* -** Finally, some convenience items. -*/ + * Finally, some convenience items. + */ #ifndef TRUE #define TRUE 1 @@ -243,54 +100,7 @@ char * scheck P((const char *string, const char *format)); ((TYPE_BIT(type) - TYPE_SIGNED(type)) * 302 / 1000 + 1 + TYPE_SIGNED(type)) #endif /* !defined INT_STRLEN_MAXIMUM */ -/* -** INITIALIZE(x) -*/ - -#ifndef GNUC_or_lint -#ifdef lint -#define GNUC_or_lint -#endif /* defined lint */ -#ifndef lint -#ifdef __GNUC__ -#define GNUC_or_lint -#endif /* defined __GNUC__ */ -#endif /* !defined lint */ -#endif /* !defined GNUC_or_lint */ - -#ifndef INITIALIZE -#ifdef GNUC_or_lint -#define INITIALIZE(x) ((x) = 0) -#endif /* defined GNUC_or_lint */ -#ifndef GNUC_or_lint -#define INITIALIZE(x) -#endif /* !defined GNUC_or_lint */ -#endif /* !defined INITIALIZE */ - -/* -** For the benefit of GNU folk... -** `_(MSGID)' uses the current locale's message library string for MSGID. -** The default is to use gettext if available, and use MSGID otherwise. -*/ - -#ifndef _ -#if HAVE_GETTEXT - 0 -#define _(msgid) gettext(msgid) -#else /* !(HAVE_GETTEXT - 0) */ -#define _(msgid) msgid -#endif /* !(HAVE_GETTEXT - 0) */ -#endif /* !defined _ */ - -#ifndef TZ_DOMAIN -#define TZ_DOMAIN "tz" -#endif /* !defined TZ_DOMAIN */ - -#if HAVE_INCOMPATIBLE_CTIME_R -#undef asctime_r -#undef ctime_r -char *asctime_r P((struct tm const *, char *)); -char *ctime_r P((time_t const *, char *)); -#endif /* HAVE_INCOMPATIBLE_CTIME_R */ +#define _(msgid) (msgid) /* ** UNIX was a registered trademark of The Open Group in 2003. diff --git a/src/timezone/scheck.c b/src/timezone/scheck.c index 39feeba701..3c508025fa 100644 --- a/src/timezone/scheck.c +++ b/src/timezone/scheck.c @@ -1,17 +1,9 @@ -#ifndef lint -#ifndef NOID -static char elsieid[] = "@(#)scheck.c 8.15"; -#endif /* !defined lint */ -#endif /* !defined NOID */ - -/*LINTLIBRARY*/ +#include "postgres.h" #include "private.h" -char * -scheck(string, format) -const char * const string; -const char * const format; + +char *scheck(const char *string, const char *format) { register char * fbuf; register const char * fp; diff --git a/src/timezone/strftime.c b/src/timezone/strftime.c new file mode 100644 index 0000000000..315a018b97 --- /dev/null +++ b/src/timezone/strftime.c @@ -0,0 +1,480 @@ +/* +** Copyright (c) 1989 The Regents of the University of California. +** All rights reserved. +** +** Redistribution and use in source and binary forms are permitted +** provided that the above copyright notice and this paragraph are +** duplicated in all such forms and that any documentation, +** advertising materials, and other materials related to such +** distribution and use acknowledge that the software was developed +** by the University of California, Berkeley. The name of the +** University may not be used to endorse or promote products derived +** from this software without specific prior written permission. +** THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR +** IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +*/ + +#include "postgres.h" + +#include +#include + +#include "pgtz.h" +#include "private.h" +#include "tzfile.h" + + +struct lc_time_T { + const char * mon[MONSPERYEAR]; + const char * month[MONSPERYEAR]; + const char * wday[DAYSPERWEEK]; + const char * weekday[DAYSPERWEEK]; + const char * X_fmt; + const char * x_fmt; + const char * c_fmt; + const char * am; + const char * pm; + const char * date_fmt; +}; + +#define Locale (&C_time_locale) + +static const struct lc_time_T C_time_locale = { + { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" + }, { + "January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December" + }, { + "Sun", "Mon", "Tue", "Wed", + "Thu", "Fri", "Sat" + }, { + "Sunday", "Monday", "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday" + }, + + /* X_fmt */ + "%H:%M:%S", + + /* + ** x_fmt + ** C99 requires this format. + ** Using just numbers (as here) makes Quakers happier; + ** it's also compatible with SVR4. + */ + "%m/%d/%y", + + /* + ** c_fmt + ** C99 requires this format. + ** Previously this code used "%D %X", but we now conform to C99. + ** Note that + ** "%a %b %d %H:%M:%S %Y" + ** is used by Solaris 2.3. + */ + "%a %b %e %T %Y", + + /* am */ + "AM", + + /* pm */ + "PM", + + /* date_fmt */ + "%a %b %e %H:%M:%S %Z %Y" +}; + +static char * _add (const char *, char *, const char *); +static char * _conv (int, const char *, char *, const char *); +static char * _fmt (const char *, const struct pg_tm *, char *, const char *, int *); + +#define IN_NONE 0 +#define IN_SOME 1 +#define IN_THIS 2 +#define IN_ALL 3 + + +size_t pg_strftime(char *s, size_t maxsize, const char *format, const struct pg_tm *t) +{ + char * p; + int warn; + + warn = IN_NONE; + p = _fmt(((format == NULL) ? "%c" : format), t, s, s + maxsize, &warn); + if (p == s + maxsize) + return 0; + *p = '\0'; + return p - s; +} + +static char * _fmt(const char *format, const struct pg_tm *t, char *pt, const char *ptlim, int *warnp) +{ + for ( ; *format; ++format) { + if (*format == '%') { +label: + switch (*++format) { + case '\0': + --format; + break; + case 'A': + pt = _add((t->tm_wday < 0 || + t->tm_wday >= DAYSPERWEEK) ? + "?" : Locale->weekday[t->tm_wday], + pt, ptlim); + continue; + case 'a': + pt = _add((t->tm_wday < 0 || + t->tm_wday >= DAYSPERWEEK) ? + "?" : Locale->wday[t->tm_wday], + pt, ptlim); + continue; + case 'B': + pt = _add((t->tm_mon < 0 || + t->tm_mon >= MONSPERYEAR) ? + "?" : Locale->month[t->tm_mon], + pt, ptlim); + continue; + case 'b': + case 'h': + pt = _add((t->tm_mon < 0 || + t->tm_mon >= MONSPERYEAR) ? + "?" : Locale->mon[t->tm_mon], + pt, ptlim); + continue; + case 'C': + /* + ** %C used to do a... + ** _fmt("%a %b %e %X %Y", t); + ** ...whereas now POSIX 1003.2 calls for + ** something completely different. + ** (ado, 1993-05-24) + */ + pt = _conv((t->tm_year + TM_YEAR_BASE) / 100, + "%02d", pt, ptlim); + continue; + case 'c': + { + int warn2 = IN_SOME; + + pt = _fmt(Locale->c_fmt, t, pt, ptlim, warnp); + if (warn2 == IN_ALL) + warn2 = IN_THIS; + if (warn2 > *warnp) + *warnp = warn2; + } + continue; + case 'D': + pt = _fmt("%m/%d/%y", t, pt, ptlim, warnp); + continue; + case 'd': + pt = _conv(t->tm_mday, "%02d", pt, ptlim); + continue; + case 'E': + case 'O': + /* + ** C99 locale modifiers. + ** The sequences + ** %Ec %EC %Ex %EX %Ey %EY + ** %Od %oe %OH %OI %Om %OM + ** %OS %Ou %OU %OV %Ow %OW %Oy + ** are supposed to provide alternate + ** representations. + */ + goto label; + case 'e': + pt = _conv(t->tm_mday, "%2d", pt, ptlim); + continue; + case 'F': + pt = _fmt("%Y-%m-%d", t, pt, ptlim, warnp); + continue; + case 'H': + pt = _conv(t->tm_hour, "%02d", pt, ptlim); + continue; + case 'I': + pt = _conv((t->tm_hour % 12) ? + (t->tm_hour % 12) : 12, + "%02d", pt, ptlim); + continue; + case 'j': + pt = _conv(t->tm_yday + 1, "%03d", pt, ptlim); + continue; + case 'k': + /* + ** This used to be... + ** _conv(t->tm_hour % 12 ? + ** t->tm_hour % 12 : 12, 2, ' '); + ** ...and has been changed to the below to + ** match SunOS 4.1.1 and Arnold Robbins' + ** strftime version 3.0. That is, "%k" and + ** "%l" have been swapped. + ** (ado, 1993-05-24) + */ + pt = _conv(t->tm_hour, "%2d", pt, ptlim); + continue; +#ifdef KITCHEN_SINK + case 'K': + /* + ** After all this time, still unclaimed! + */ + pt = _add("kitchen sink", pt, ptlim); + continue; +#endif /* defined KITCHEN_SINK */ + case 'l': + /* + ** This used to be... + ** _conv(t->tm_hour, 2, ' '); + ** ...and has been changed to the below to + ** match SunOS 4.1.1 and Arnold Robbin's + ** strftime version 3.0. That is, "%k" and + ** "%l" have been swapped. + ** (ado, 1993-05-24) + */ + pt = _conv((t->tm_hour % 12) ? + (t->tm_hour % 12) : 12, + "%2d", pt, ptlim); + continue; + case 'M': + pt = _conv(t->tm_min, "%02d", pt, ptlim); + continue; + case 'm': + pt = _conv(t->tm_mon + 1, "%02d", pt, ptlim); + continue; + case 'n': + pt = _add("\n", pt, ptlim); + continue; + case 'p': + pt = _add((t->tm_hour >= (HOURSPERDAY / 2)) ? + Locale->pm : + Locale->am, + pt, ptlim); + continue; + case 'R': + pt = _fmt("%H:%M", t, pt, ptlim, warnp); + continue; + case 'r': + pt = _fmt("%I:%M:%S %p", t, pt, ptlim, warnp); + continue; + case 'S': + pt = _conv(t->tm_sec, "%02d", pt, ptlim); + continue; + case 's': + { + struct pg_tm tm; + char buf[INT_STRLEN_MAXIMUM(time_t) + 1]; + time_t mkt; + + tm = *t; + mkt = pg_mktime(&tm); + if (TYPE_SIGNED(time_t)) + (void) sprintf(buf, "%ld", (long) mkt); + else + (void) sprintf(buf, "%lu", (unsigned long) mkt); + pt = _add(buf, pt, ptlim); + } + continue; + case 'T': + pt = _fmt("%H:%M:%S", t, pt, ptlim, warnp); + continue; + case 't': + pt = _add("\t", pt, ptlim); + continue; + case 'U': + pt = _conv((t->tm_yday + DAYSPERWEEK - + t->tm_wday) / DAYSPERWEEK, + "%02d", pt, ptlim); + continue; + case 'u': + /* + ** From Arnold Robbins' strftime version 3.0: + ** "ISO 8601: Weekday as a decimal number + ** [1 (Monday) - 7]" + ** (ado, 1993-05-24) + */ + pt = _conv((t->tm_wday == 0) ? + DAYSPERWEEK : t->tm_wday, + "%d", pt, ptlim); + continue; + case 'V': /* ISO 8601 week number */ + case 'G': /* ISO 8601 year (four digits) */ + case 'g': /* ISO 8601 year (two digits) */ +/* +** From Arnold Robbins' strftime version 3.0: "the week number of the +** year (the first Monday as the first day of week 1) as a decimal number +** (01-53)." +** (ado, 1993-05-24) +** +** From "http://www.ft.uni-erlangen.de/~mskuhn/iso-time.html" by Markus Kuhn: +** "Week 01 of a year is per definition the first week which has the +** Thursday in this year, which is equivalent to the week which contains +** the fourth day of January. In other words, the first week of a new year +** is the week which has the majority of its days in the new year. Week 01 +** might also contain days from the previous year and the week before week +** 01 of a year is the last week (52 or 53) of the previous year even if +** it contains days from the new year. A week starts with Monday (day 1) +** and ends with Sunday (day 7). For example, the first week of the year +** 1997 lasts from 1996-12-30 to 1997-01-05..." +** (ado, 1996-01-02) +*/ + { + int year; + int yday; + int wday; + int w; + + year = t->tm_year + TM_YEAR_BASE; + yday = t->tm_yday; + wday = t->tm_wday; + for ( ; ; ) { + int len; + int bot; + int top; + + len = isleap(year) ? + DAYSPERLYEAR : + DAYSPERNYEAR; + /* + ** What yday (-3 ... 3) does + ** the ISO year begin on? + */ + bot = ((yday + 11 - wday) % + DAYSPERWEEK) - 3; + /* + ** What yday does the NEXT + ** ISO year begin on? + */ + top = bot - + (len % DAYSPERWEEK); + if (top < -3) + top += DAYSPERWEEK; + top += len; + if (yday >= top) { + ++year; + w = 1; + break; + } + if (yday >= bot) { + w = 1 + ((yday - bot) / + DAYSPERWEEK); + break; + } + --year; + yday += isleap(year) ? + DAYSPERLYEAR : + DAYSPERNYEAR; + } + if (*format == 'V') + pt = _conv(w, "%02d", + pt, ptlim); + else if (*format == 'g') { + *warnp = IN_ALL; + pt = _conv(year % 100, "%02d", + pt, ptlim); + } else pt = _conv(year, "%04d", + pt, ptlim); + } + continue; + case 'v': + /* + ** From Arnold Robbins' strftime version 3.0: + ** "date as dd-bbb-YYYY" + ** (ado, 1993-05-24) + */ + pt = _fmt("%e-%b-%Y", t, pt, ptlim, warnp); + continue; + case 'W': + pt = _conv((t->tm_yday + DAYSPERWEEK - + (t->tm_wday ? + (t->tm_wday - 1) : + (DAYSPERWEEK - 1))) / DAYSPERWEEK, + "%02d", pt, ptlim); + continue; + case 'w': + pt = _conv(t->tm_wday, "%d", pt, ptlim); + continue; + case 'X': + pt = _fmt(Locale->X_fmt, t, pt, ptlim, warnp); + continue; + case 'x': + { + int warn2 = IN_SOME; + + pt = _fmt(Locale->x_fmt, t, pt, ptlim, &warn2); + if (warn2 == IN_ALL) + warn2 = IN_THIS; + if (warn2 > *warnp) + *warnp = warn2; + } + continue; + case 'y': + *warnp = IN_ALL; + pt = _conv((t->tm_year + TM_YEAR_BASE) % 100, + "%02d", pt, ptlim); + continue; + case 'Y': + pt = _conv(t->tm_year + TM_YEAR_BASE, "%04d", + pt, ptlim); + continue; + case 'Z': + if (t->tm_zone != NULL) + pt = _add(t->tm_zone, pt, ptlim); + /* + ** C99 says that %Z must be replaced by the + ** empty string if the time zone is not + ** determinable. + */ + continue; + case 'z': + { + int diff; + char const * sign; + + if (t->tm_isdst < 0) + continue; + diff = t->tm_gmtoff; + if (diff < 0) { + sign = "-"; + diff = -diff; + } else sign = "+"; + pt = _add(sign, pt, ptlim); + diff /= 60; + pt = _conv((diff/60)*100 + diff%60, + "%04d", pt, ptlim); + } + continue; + case '+': + pt = _fmt(Locale->date_fmt, t, pt, ptlim, + warnp); + continue; + case '%': + /* + ** X311J/88-090 (4.12.3.5): if conversion char is + ** undefined, behavior is undefined. Print out the + ** character itself as printf(3) also does. + */ + default: + break; + } + } + if (pt == ptlim) + break; + *pt++ = *format; + } + return pt; +} + +static char * _conv(const int n, const char *format, char *pt, const char *ptlim) +{ + char buf[INT_STRLEN_MAXIMUM(int) + 1]; + + (void) sprintf(buf, format, n); + return _add(buf, pt, ptlim); +} + +static char *_add(const char *str, char *pt, const char *ptlim) +{ + while (pt < ptlim && (*pt = *str++) != '\0') + ++pt; + return pt; +} diff --git a/src/timezone/tzfile.h b/src/timezone/tzfile.h index 0921c3c339..de7fba8438 100644 --- a/src/timezone/tzfile.h +++ b/src/timezone/tzfile.h @@ -15,31 +15,12 @@ ** Thank you! */ -/* -** ID -*/ - -#ifndef lint -#ifndef NOID -static char tzfilehid[] = "@(#)tzfile.h 7.14"; -#endif /* !defined NOID */ -#endif /* !defined lint */ - /* ** Information about time zone files. */ -#ifndef TZDIR -#define TZDIR "/usr/local/etc/zoneinfo" /* Time zone object file directory */ -#endif /* !defined TZDIR */ - -#ifndef TZDEFAULT #define TZDEFAULT "localtime" -#endif /* !defined TZDEFAULT */ - -#ifndef TZDEFRULES #define TZDEFRULES "posixrules" -#endif /* !defined TZDEFRULES */ /* ** Each file begins with. . . @@ -88,7 +69,6 @@ struct tzhead { ** exceed any of the limits below. */ -#ifndef TZ_MAX_TIMES /* ** The TZ_MAX_TIMES value below is enough to handle a bit more than a ** year's worth of solar time (corrected daily to the nearest second) or @@ -96,29 +76,13 @@ struct tzhead { ** (where there are three time zone transitions every fourth year). */ #define TZ_MAX_TIMES 370 -#endif /* !defined TZ_MAX_TIMES */ -#ifndef TZ_MAX_TYPES -#ifndef NOSOLAR #define TZ_MAX_TYPES 256 /* Limited by what (unsigned char)'s can hold */ -#endif /* !defined NOSOLAR */ -#ifdef NOSOLAR -/* -** Must be at least 14 for Europe/Riga as of Jan 12 1995, -** as noted by Earl Chew . -*/ -#define TZ_MAX_TYPES 20 /* Maximum number of local time types */ -#endif /* !defined NOSOLAR */ -#endif /* !defined TZ_MAX_TYPES */ -#ifndef TZ_MAX_CHARS #define TZ_MAX_CHARS 50 /* Maximum number of abbreviation characters */ /* (limited by what unsigned chars can hold) */ -#endif /* !defined TZ_MAX_CHARS */ -#ifndef TZ_MAX_LEAPS #define TZ_MAX_LEAPS 50 /* Maximum number of leap second corrections */ -#endif /* !defined TZ_MAX_LEAPS */ #define SECSPERMIN 60 #define MINSPERHOUR 60 @@ -163,26 +127,4 @@ struct tzhead { #define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0)) -#ifndef USG - -/* -** Use of the underscored variants may cause problems if you move your code to -** certain System-V-based systems; for maximum portability, use the -** underscore-free variants. The underscored variants are provided for -** backward compatibility only; they may disappear from future versions of -** this file. -*/ - -#define SECS_PER_MIN SECSPERMIN -#define MINS_PER_HOUR MINSPERHOUR -#define HOURS_PER_DAY HOURSPERDAY -#define DAYS_PER_WEEK DAYSPERWEEK -#define DAYS_PER_NYEAR DAYSPERNYEAR -#define DAYS_PER_LYEAR DAYSPERLYEAR -#define SECS_PER_HOUR SECSPERHOUR -#define SECS_PER_DAY SECSPERDAY -#define MONS_PER_YEAR MONSPERYEAR - -#endif /* !defined USG */ - #endif /* !defined TZFILE_H */ diff --git a/src/timezone/zic.c b/src/timezone/zic.c index 28585ac52f..490d133fb7 100644 --- a/src/timezone/zic.c +++ b/src/timezone/zic.c @@ -1,19 +1,20 @@ -static char elsieid[] = "@(#)zic.c 7.115"; +#include "postgres.h" + +#include + #include "pgtz.h" -#undef unlink -#undef TZDIR -#define TZDIR "data" +#include "private.h" +#include "tzfile.h" + #ifdef WIN32 +#undef unlink #include #endif -#include "private.h" -#include "locale.h" -#include "tzfile.h" - -#if HAVE_SYS_STAT_H -#include "sys/stat.h" +#ifdef HAVE_SYS_STAT_H +#include #endif + #ifndef WIN32 #ifdef S_IRUSR #define MKDIR_UMASK (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH) @@ -22,11 +23,7 @@ static char elsieid[] = "@(#)zic.c 7.115"; #endif #endif -/* - * This allows zic to compile by just assigning a dummy value. - * pgtz.c references it, but no one uses it from zic. - */ -char my_exec_path[MAXPGPATH] = ""; +static char elsieid[] = "@(#)zic.c 7.115"; /* ** On some ancient hosts, predicates like `isspace(C)' are defined @@ -36,7 +33,7 @@ char my_exec_path[MAXPGPATH] = ""; ** For portability, we check both ancient and modern requirements. ** If isascii is not defined, the isascii check succeeds trivially. */ -#include "ctype.h" +#include #ifndef isascii #define isascii(x) 1 #endif @@ -94,62 +91,57 @@ struct zone { time_t z_untiltime; }; -extern int getopt P((int argc, char * const argv[], - const char * options)); -extern int link P((const char * fromname, const char * toname)); -extern char * optarg; -extern int optind; - -static void addtt P((time_t starttime, int type)); -static int addtype P((long gmtoff, const char * abbr, int isdst, - int ttisstd, int ttisgmt)); -static void leapadd P((time_t t, int positive, int rolling, int count)); -static void adjleap P((void)); -static void associate P((void)); -static int ciequal P((const char * ap, const char * bp)); -static void convert P((long val, char * buf)); -static void dolink P((const char * fromfile, const char * tofile)); -static void doabbr P((char * abbr, const char * format, - const char * letters, int isdst)); -static void eat P((const char * name, int num)); -static void eats P((const char * name, int num, - const char * rname, int rnum)); -static long eitol P((int i)); -static void error P((const char * message)); -static char ** getfields P((char * buf)); -static long gethms P((const char * string, const char * errstrng, - int signable)); -static void infile P((const char * filename)); -static void inleap P((char ** fields, int nfields)); -static void inlink P((char ** fields, int nfields)); -static void inrule P((char ** fields, int nfields)); -static int inzcont P((char ** fields, int nfields)); -static int inzone P((char ** fields, int nfields)); -static int inzsub P((char ** fields, int nfields, int iscont)); -static int itsabbr P((const char * abbr, const char * word)); -static int itsdir P((const char * name)); -static int lowerit P((int c)); -static char * memcheck P((char * tocheck)); -static int mkdirs P((char * filename)); -static void newabbr P((const char * abbr)); -static long oadd P((long t1, long t2)); -static void outzone P((const struct zone * zp, int ntzones)); -static void puttzcode P((long code, FILE * fp)); -static int rcomp P((const void * leftp, const void * rightp)); -static time_t rpytime P((const struct rule * rp, int wantedy)); -static void rulesub P((struct rule * rp, +extern int link (const char * fromname, const char * toname); +static void addtt (time_t starttime, int type); +static int addtype (long gmtoff, const char * abbr, int isdst, + int ttisstd, int ttisgmt); +static void leapadd (time_t t, int positive, int rolling, int count); +static void adjleap (void); +static void associate (void); +static int ciequal (const char * ap, const char * bp); +static void convert (long val, char * buf); +static void dolink (const char * fromfile, const char * tofile); +static void doabbr (char * abbr, const char * format, + const char * letters, int isdst); +static void eat (const char * name, int num); +static void eats (const char * name, int num, + const char * rname, int rnum); +static long eitol (int i); +static void error (const char * message); +static char ** getfields (char * buf); +static long gethms (const char * string, const char * errstrng, + int signable); +static void infile (const char * filename); +static void inleap (char ** fields, int nfields); +static void inlink (char ** fields, int nfields); +static void inrule (char ** fields, int nfields); +static int inzcont (char ** fields, int nfields); +static int inzone (char ** fields, int nfields); +static int inzsub (char ** fields, int nfields, int iscont); +static int itsabbr (const char * abbr, const char * word); +static int itsdir (const char * name); +static int lowerit (int c); +static char * memcheck (char * tocheck); +static int mkdirs (char * filename); +static void newabbr (const char * abbr); +static long oadd (long t1, long t2); +static void outzone (const struct zone * zp, int ntzones); +static void puttzcode (long code, FILE * fp); +static int rcomp (const void * leftp, const void * rightp); +static time_t rpytime (const struct rule * rp, int wantedy); +static void rulesub (struct rule * rp, const char * loyearp, const char * hiyearp, const char * typep, const char * monthp, - const char * dayp, const char * timep)); -static void setboundaries P((void)); -static time_t tadd P((time_t t1, long t2)); -static void usage P((void)); -static void writezone P((const char * name)); -static int yearistype P((int year, const char * type)); + const char * dayp, const char * timep); +static void setboundaries (void); +static time_t tadd (time_t t1, long t2); +static void usage (void); +static void writezone (const char * name); +static int yearistype (int year, const char * type); -#if !(HAVE_STRERROR - 0) -static char * strerror P((int)); -#endif /* !(HAVE_STRERROR - 0) */ +#ifndef HAVE_STRERROR +static char * strerror (int); +#endif static int charcnt; static int errors; @@ -271,8 +263,8 @@ struct lookup { const int l_value; }; -static struct lookup const * byword P((const char * string, - const struct lookup * lp)); +static struct lookup const * byword (const char * string, + const struct lookup * lp); static struct lookup const line_codes[] = { { "Rule", LC_RULE }, @@ -389,10 +381,8 @@ char * const ptr; ** Error handling. */ -#if !(HAVE_STRERROR - 0) -static char * -strerror(errnum) -int errnum; +#ifndef HAVE_STRERROR +static char *strerror(int errnum) { extern char * sys_errlist[]; extern int sys_nerr; @@ -400,14 +390,9 @@ int errnum; return (errnum > 0 && errnum <= sys_nerr) ? sys_errlist[errnum] : _("Unknown system error"); } -#endif /* !(HAVE_STRERROR - 0) */ +#endif -static void -eats(name, num, rname, rnum) -const char * const name; -const int num; -const char * const rname; -const int rnum; +static void eats(const char *name, const int num, const char *rname, const int rnum) { filename = name; linenum = num; @@ -415,17 +400,12 @@ const int rnum; rlinenum = rnum; } -static void -eat(name, num) -const char * const name; -const int num; +static void eat(const char *name, const int num) { eats(name, num, (char *) NULL, -1); } -static void -error(string) -const char * const string; +static void error(const char *string) { /* ** Match the format of "cc" to allow sh users to @@ -441,9 +421,7 @@ const char * const string; ++errors; } -static void -warning(string) -const char * const string; +static void warning(const char *string) { char * cp; @@ -454,8 +432,7 @@ const char * const string; --errors; } -static void -usage P((void)) +static void usage(void) { (void) fprintf(stderr, _("%s: usage is %s [ --version ] [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] \\\n\t[ -d directory ] [ -L leapseconds ] [ -y yearistype ] [ filename ... ]\n"), progname, progname); @@ -469,25 +446,15 @@ static const char * leapsec; static const char * yitcommand; static int sflag = FALSE; -int -main(argc, argv) -int argc; -char * argv[]; +int main(int argc, char *argv[]) { register int i; register int j; register int c; -#ifdef unix +#ifndef WIN32 (void) umask(umask(S_IWGRP | S_IWOTH) | (S_IWGRP | S_IWOTH)); -#endif /* defined unix */ -#if HAVE_GETTEXT - 0 - (void) setlocale(LC_MESSAGES, ""); -#ifdef TZ_DOMAINDIR - (void) bindtextdomain(TZ_DOMAIN, TZ_DOMAINDIR); -#endif /* defined TEXTDOMAINDIR */ - (void) textdomain(TZ_DOMAIN); -#endif /* HAVE_GETTEXT - 0 */ +#endif /* !WIN32 */ progname = argv[0]; for (i = 1; i < argc; ++i) if (strcmp(argv[i], "--version") == 0) { @@ -558,7 +525,7 @@ _("%s: More than one -L option specified\n"), if (optind == argc - 1 && strcmp(argv[optind], "=") == 0) usage(); /* usage message by request */ if (directory == NULL) - directory = TZDIR; + directory = "data"; if (yitcommand == NULL) yitcommand = "yearistype"; @@ -600,10 +567,7 @@ _("%s: More than one -L option specified\n"), return (errors == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } -static void -dolink(fromfile, tofile) -const char * const fromfile; -const char * const tofile; +static void dolink(const char *fromfile, const char *tofile) { register char * fromname; register char * toname; @@ -635,7 +599,7 @@ const char * const tofile; (void) exit(EXIT_FAILURE); result = link(fromname, toname); -#if (HAVE_SYMLINK - 0) +#ifdef HAVE_SYMLINK if (result != 0 && access(fromname, F_OK) == 0 && !itsdir(fromname)) { @@ -682,8 +646,7 @@ warning(_("hard link failed, symbolic link used")); #define MAX_BITS_IN_FILE 32 #define TIME_T_BITS_IN_FILE ((TYPE_BIT(time_t) < MAX_BITS_IN_FILE) ? TYPE_BIT(time_t) : MAX_BITS_IN_FILE) -static void -setboundaries P((void)) +static void setboundaries(void) { if (TYPE_SIGNED(time_t)) { min_time = ~ (time_t) 0; @@ -697,15 +660,13 @@ setboundaries P((void)) max_time <<= TIME_T_BITS_IN_FILE - 1; --max_time; } - min_year = TM_YEAR_BASE + gmtime(&min_time)->tm_year; - max_year = TM_YEAR_BASE + gmtime(&max_time)->tm_year; + min_year = TM_YEAR_BASE + pg_gmtime(&min_time)->tm_year; + max_year = TM_YEAR_BASE + pg_gmtime(&max_time)->tm_year; min_year_representable = min_year; max_year_representable = max_year; } -static int -itsdir(name) -const char * const name; +static int itsdir(const char *name) { register char * myname; register int accres; @@ -725,17 +686,13 @@ const char * const name; ** Sort by rule name. */ -static int -rcomp(cp1, cp2) -const void * cp1; -const void * cp2; +static int rcomp(const void *cp1, const void *cp2) { return strcmp(((const struct rule *) cp1)->r_name, ((const struct rule *) cp2)->r_name); } -static void -associate P((void)) +static void associate(void) { register struct zone * zp; register struct rule * rp; @@ -810,9 +767,7 @@ associate P((void)) (void) exit(EXIT_FAILURE); } -static void -infile(name) -const char * name; +static void infile(const char *name) { register FILE * fp; register char ** fields; @@ -914,11 +869,7 @@ _("%s: panic: Invalid l_value %d\n"), ** Call error with errstring and return zero on errors. */ -static long -gethms(string, errstring, signable) -const char * string; -const char * const errstring; -const int signable; +static long gethms(const char *string, const char *errstring, const int signable) { int hh, mm, ss, sign; @@ -953,10 +904,7 @@ const int signable; eitol(SECSPERMIN) + eitol(ss)); } -static void -inrule(fields, nfields) -register char ** const fields; -const int nfields; +static void inrule(register char **fields, const int nfields) { static struct rule r; @@ -980,10 +928,7 @@ const int nfields; rules[nrules++] = r; } -static int -inzone(fields, nfields) -register char ** const fields; -const int nfields; +static int inzone(register char **fields, const int nfields) { register int i; static char * buf; @@ -1025,10 +970,7 @@ _("duplicate zone name %s (file \"%s\", line %d)"), return inzsub(fields, nfields, FALSE); } -static int -inzcont(fields, nfields) -register char ** const fields; -const int nfields; +static int inzcont(register char **fields, const int nfields) { if (nfields < ZONEC_MINFIELDS || nfields > ZONEC_MAXFIELDS) { error(_("wrong number of fields on Zone continuation line")); @@ -1037,11 +979,7 @@ const int nfields; return inzsub(fields, nfields, TRUE); } -static int -inzsub(fields, nfields, iscont) -register char ** const fields; -const int nfields; -const int iscont; +static int inzsub(register char **fields, const int nfields, const int iscont) { register char * cp; static struct zone z; @@ -1114,10 +1052,7 @@ const int iscont; return hasuntil; } -static void -inleap(fields, nfields) -register char ** const fields; -const int nfields; +static void inleap(register char **fields, const int nfields) { register const char * cp; register const struct lookup * lp; @@ -1211,10 +1146,7 @@ const int nfields; } } -static void -inlink(fields, nfields) -register char ** const fields; -const int nfields; +static void inlink(register char **fields, const int nfields) { struct link l; @@ -1239,15 +1171,7 @@ const int nfields; links[nlinks++] = l; } -static void -rulesub(rp, loyearp, hiyearp, typep, monthp, dayp, timep) -register struct rule * const rp; -const char * const loyearp; -const char * const hiyearp; -const char * const typep; -const char * const monthp; -const char * const dayp; -const char * const timep; +static void rulesub(register struct rule *rp, const char *loyearp, const char *hiyearp, const char *typep, const char *monthp, const char *dayp, const char *timep) { register const struct lookup * lp; register const char * cp; @@ -1399,10 +1323,7 @@ const char * const timep; ifree(dp); } -static void -convert(val, buf) -const long val; -char * const buf; +static void convert(const long val, char *buf) { register int i; register long shift; @@ -1411,10 +1332,7 @@ char * const buf; buf[i] = val >> shift; } -static void -puttzcode(val, fp) -const long val; -FILE * const fp; +static void puttzcode(const long val, FILE *fp) { char buf[4]; @@ -1422,10 +1340,7 @@ FILE * const fp; (void) fwrite((void *) buf, (size_t) sizeof buf, (size_t) 1, fp); } -static int -atcomp(avp, bvp) -void * avp; -void * bvp; +static int atcomp(const void *avp,const void *bvp) { if (((struct attype *) avp)->at < ((struct attype *) bvp)->at) return -1; @@ -1434,9 +1349,7 @@ void * bvp; else return 0; } -static void -writezone(name) -const char * const name; +static void writezone(const char *name) { register FILE * fp; register int i, j; @@ -1579,12 +1492,7 @@ const char * const name; } } -static void -doabbr(abbr, format, letters, isdst) -char * const abbr; -const char * const format; -const char * const letters; -const int isdst; +static void doabbr(char *abbr, const char *format, const char *letters, const int isdst) { if (strchr(format, '/') == NULL) { if (letters == NULL) @@ -1598,16 +1506,14 @@ const int isdst; } } -static void -outzone(zpfirst, zonecount) -const struct zone * const zpfirst; -const int zonecount; +static void outzone(const struct zone *zpfirst, const int zonecount) { register const struct zone * zp; register struct rule * rp; register int i, j; register int usestart, useuntil; - register time_t starttime, untiltime; + register time_t starttime = 0; + register time_t untiltime = 0; register long gmtoff; register long stdoff; register int year; @@ -1617,8 +1523,6 @@ const int zonecount; register int type; char startbuf[BUFSIZ]; - INITIALIZE(untiltime); - INITIALIZE(starttime); /* ** Now. . .finally. . .generate some useful data! */ @@ -1676,11 +1580,10 @@ const int zonecount; } for ( ; ; ) { register int k; - register time_t jtime, ktime; + register time_t jtime, ktime = 0; register long offset; char buf[BUFSIZ]; - INITIALIZE(ktime); if (useuntil) { /* ** Turn untiltime into UTC @@ -1786,10 +1689,7 @@ error(_("can't determine time zone abbreviation to use just after until time")); writezone(zpfirst->z_name); } -static void -addtt(starttime, type) -const time_t starttime; -int type; +static void addtt(const time_t starttime, int type) { if (starttime <= min_time || (timecnt == 1 && attypes[0].at < min_time)) { @@ -1814,13 +1714,7 @@ int type; ++timecnt; } -static int -addtype(gmtoff, abbr, isdst, ttisstd, ttisgmt) -const long gmtoff; -const char * const abbr; -const int isdst; -const int ttisstd; -const int ttisgmt; +static int addtype(const long gmtoff, const char *abbr, const int isdst, const int ttisstd, const int ttisgmt) { register int i, j; @@ -1870,12 +1764,7 @@ const int ttisgmt; return i; } -static void -leapadd(t, positive, rolling, count) -const time_t t; -const int positive; -const int rolling; -int count; +static void leapadd(const time_t t, const int positive, const int rolling, int count) { register int i, j; @@ -1904,8 +1793,7 @@ int count; } while (positive && --count != 0); } -static void -adjleap P((void)) +static void adjleap(void) { register int i; register long last = 0; @@ -1919,10 +1807,7 @@ adjleap P((void)) } } -static int -yearistype(year, type) -const int year; -const char * const type; +static int yearistype(const int year, const char *type) { static char * buf; int result; @@ -1945,18 +1830,13 @@ const char * const type; (void) exit(EXIT_FAILURE); } -static int -lowerit(a) -int a; +static int lowerit(int a) { a = (unsigned char) a; return (isascii(a) && isupper(a)) ? tolower(a) : a; } -static int -ciequal(ap, bp) /* case-insensitive equality */ -register const char * ap; -register const char * bp; +static int ciequal(register const char *ap, register const char *bp) { while (lowerit(*ap) == lowerit(*bp++)) if (*ap++ == '\0') @@ -1964,10 +1844,7 @@ register const char * bp; return FALSE; } -static int -itsabbr(abbr, word) -register const char * abbr; -register const char * word; +static int itsabbr(register const char *abbr, register const char *word) { if (lowerit(*abbr) != lowerit(*word)) return FALSE; @@ -1980,10 +1857,7 @@ register const char * word; return TRUE; } -static const struct lookup * -byword(word, table) -register const char * const word; -register const struct lookup * const table; +static const struct lookup *byword(register const char *word, register const struct lookup *table) { register const struct lookup * foundlp; register const struct lookup * lp; @@ -2009,9 +1883,7 @@ register const struct lookup * const table; return foundlp; } -static char ** -getfields(cp) -register char * cp; +static char **getfields(register char *cp) { register char * dp; register char ** array; @@ -2045,10 +1917,7 @@ register char * cp; return array; } -static long -oadd(t1, t2) -const long t1; -const long t2; +static long oadd(const long t1, const long t2) { register long t; @@ -2060,10 +1929,7 @@ const long t2; return t; } -static time_t -tadd(t1, t2) -const time_t t1; -const long t2; +static time_t tadd(const time_t t1, const long t2) { register time_t t; @@ -2084,10 +1950,7 @@ const long t2; ** 1970, 00:00 LOCAL time - in that year that the rule refers to. */ -static time_t -rpytime(rp, wantedy) -register const struct rule * const rp; -register const int wantedy; +static time_t rpytime(register const struct rule *rp, register const int wantedy) { register int y, m, i; register long dayoff; /* with a nod to Margaret O. */ @@ -2168,9 +2031,7 @@ register const int wantedy; return tadd(t, rp->r_tod); } -static void -newabbr(string) -const char * const string; +static void newabbr(const char *string) { register int i; @@ -2183,9 +2044,7 @@ const char * const string; charcnt += eitol(i); } -static int -mkdirs(argname) -char * const argname; +static int mkdirs(char *argname) { register char * name; register char * cp; @@ -2195,7 +2054,7 @@ char * const argname; cp = name = ecpyalloc(argname); while ((cp = strchr(cp + 1, '/')) != 0) { *cp = '\0'; -#ifndef unix +#ifdef WIN32 /* ** DOS drive specifier? */ @@ -2204,7 +2063,7 @@ char * const argname; *cp = '/'; continue; } -#endif /* !defined unix */ +#endif /* WIN32 */ if (!itsdir(name)) { /* ** It doesn't seem to exist, so we try to create it. @@ -2230,9 +2089,7 @@ _("%s: Can't create directory %s: %s\n"), return 0; } -static long -eitol(i) -const int i; +static long eitol(const int i) { long l; @@ -2262,3 +2119,13 @@ int link(const char *oldpath, const char *newpath) { return 0; } #endif + +/* + * This allows zic to compile by just assigning a dummy value. + * localtime.c references it, but no one uses it from zic. + */ +char * +pg_TZDIR(void) +{ + return NULL; +}