Skip to content
Snippets Groups Projects
Commit 9e716609 authored by Thomas G. Lockhart's avatar Thomas G. Lockhart
Browse files

Support full POSIX-style time zone: EST+3, PST-3, etc.

We probably support a superset of the spec, but I don't have the spec
 to confirm this.
Update regression tests to include tests for this format.
parent 90c4bab7
No related branches found
No related tags found
No related merge requests found
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/datetime.c,v 1.43 2000/03/14 23:06:36 thomas Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/datetime.c,v 1.44 2000/03/16 14:36:51 thomas Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -35,6 +35,8 @@ ...@@ -35,6 +35,8 @@
#define USE_DATE_CACHE 1 #define USE_DATE_CACHE 1
#define ROUND_ALL 0 #define ROUND_ALL 0
static int DecodePosixTimezone(char *str, int *val);
int day_tab[2][13] = { int day_tab[2][13] = {
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0}, {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0},
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0}}; {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0}};
...@@ -47,15 +49,6 @@ char *days[] = {"Sunday", "Monday", "Tuesday", "Wednesday", ...@@ -47,15 +49,6 @@ char *days[] = {"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", NULL}; "Thursday", "Friday", "Saturday", NULL};
#if 0
static void GetEpochTime(struct tm * tm);
#endif
#define UTIME_MINYEAR (1901) #define UTIME_MINYEAR (1901)
#define UTIME_MINMONTH (12) #define UTIME_MINMONTH (12)
#define UTIME_MINDAY (14) #define UTIME_MINDAY (14)
...@@ -399,35 +392,6 @@ j2day(int date) ...@@ -399,35 +392,6 @@ j2day(int date)
} /* j2day() */ } /* j2day() */
#if 0
static double
time2t(const int hour, const int min, const double sec)
{
return (((hour * 60) + min) * 60) + sec;
} /* time2t() */
static void
dt2time(Timestamp jd, int *hour, int *min, double *sec)
{
double time;
time = jd;
*hour = (time / 3600);
time -= ((*hour) * 3600);
*min = (time / 60);
time -= ((*min) * 60);
*sec = JROUND(time);
return;
} /* dt2time() */
#endif
/* /*
* parse and convert date in timestr (the normal interface) * parse and convert date in timestr (the normal interface)
* *
...@@ -493,9 +457,12 @@ ParseDateTime(char *timestr, char *lowstr, ...@@ -493,9 +457,12 @@ ParseDateTime(char *timestr, char *lowstr,
while (isalpha(*cp)) while (isalpha(*cp))
*lp++ = tolower(*cp++); *lp++ = tolower(*cp++);
/* full date string with leading text month? */ /* Full date string with leading text month?
* Could also be a POSIX time zone...
*/
if ((*cp == '-') || (*cp == '/') || (*cp == '.')) if ((*cp == '-') || (*cp == '/') || (*cp == '.'))
{ {
#if 0
/* /*
* special case of Posix timezone "GMT-0800" * special case of Posix timezone "GMT-0800"
* Note that other sign (e.g. "GMT+0800" * Note that other sign (e.g. "GMT+0800"
...@@ -512,6 +479,7 @@ ParseDateTime(char *timestr, char *lowstr, ...@@ -512,6 +479,7 @@ ParseDateTime(char *timestr, char *lowstr,
*cp = '+'; *cp = '+';
continue; continue;
} }
#endif
ftype[nf] = DTK_DATE; ftype[nf] = DTK_DATE;
while (isdigit(*cp) || (*cp == '-') || (*cp == '/') || (*cp == '.')) while (isdigit(*cp) || (*cp == '-') || (*cp == '/') || (*cp == '.'))
...@@ -627,7 +595,21 @@ DecodeDateTime(char **field, int *ftype, int nf, ...@@ -627,7 +595,21 @@ DecodeDateTime(char **field, int *ftype, int nf,
switch (ftype[i]) switch (ftype[i])
{ {
case DTK_DATE: case DTK_DATE:
if (DecodeDate(field[i], fmask, &tmask, tm) != 0) /* Already have a date?
* Then this might be a POSIX time zone
* with an embedded dash (e.g. "PST-3" == "EST")
* - thomas 2000-03-15
*/
if ((fmask & DTK_DATE_M) == DTK_DATE_M)
{
if ((tzp == NULL)
|| (DecodePosixTimezone(field[i], tzp) != 0))
return -1;
ftype[i] = DTK_TZ;
tmask = DTK_M(TZ);
}
else if (DecodeDate(field[i], fmask, &tmask, tm) != 0)
return -1; return -1;
break; break;
...@@ -646,9 +628,29 @@ DecodeDateTime(char **field, int *ftype, int nf, ...@@ -646,9 +628,29 @@ DecodeDateTime(char **field, int *ftype, int nf,
case DTK_TZ: case DTK_TZ:
if (tzp == NULL) if (tzp == NULL)
return -1; return -1;
if (DecodeTimezone(field[i], tzp) != 0)
return -1; {
tmask = DTK_M(TZ); int tz;
if (DecodeTimezone(field[i], &tz) != 0)
return -1;
/* Already have a time zone?
* Then maybe this is the second field of a POSIX time:
* EST+3 (equivalent to PST)
*/
if ((i > 0) && ((fmask & DTK_M(TZ)) != 0)
&& (ftype[i-1] == DTK_TZ) && (isalpha(*field[i-1])))
{
*tzp -= tz;
tmask = 0;
}
else
{
*tzp = tz;
tmask = DTK_M(TZ);
}
}
break; break;
case DTK_NUMBER: case DTK_NUMBER:
...@@ -779,6 +781,7 @@ DecodeDateTime(char **field, int *ftype, int nf, ...@@ -779,6 +781,7 @@ DecodeDateTime(char **field, int *ftype, int nf,
if (tzp == NULL) if (tzp == NULL)
return -1; return -1;
*tzp = val * 60; *tzp = val * 60;
ftype[i] = DTK_TZ;
break; break;
case TZ: case TZ:
...@@ -786,25 +789,7 @@ DecodeDateTime(char **field, int *ftype, int nf, ...@@ -786,25 +789,7 @@ DecodeDateTime(char **field, int *ftype, int nf,
if (tzp == NULL) if (tzp == NULL)
return -1; return -1;
*tzp = val * 60; *tzp = val * 60;
ftype[i] = DTK_TZ;
/* Swallow an immediately succeeding timezone if this is GMT
* This handles the odd case in FreeBSD of "GMT+0800"
* but note that we need to flip the sign on this too.
* Claims to be some sort of POSIX standard format :(
* - thomas 2000-01-20
*/
if ((i < (nf-1)) && (ftype[i+1] == DTK_TZ)
&& (strcmp(field[i], "gmt") == 0))
{
i++;
if (DecodeTimezone(field[i], tzp) != 0)
return -1;
/* flip the sign per POSIX standard */
*tzp = -(*tzp);
}
break; break;
case IGNORE: case IGNORE:
...@@ -962,6 +947,19 @@ DecodeTimeOnly(char **field, int *ftype, int nf, ...@@ -962,6 +947,19 @@ DecodeTimeOnly(char **field, int *ftype, int nf,
{ {
switch (ftype[i]) switch (ftype[i])
{ {
case DTK_DATE:
/* This might be a POSIX time zone
* with an embedded dash (e.g. "PST-3" == "EST")
* - thomas 2000-03-15
*/
if ((tzp == NULL)
|| (DecodePosixTimezone(field[i], tzp) != 0))
return -1;
ftype[i] = DTK_TZ;
tmask = DTK_M(TZ);
break;
case DTK_TIME: case DTK_TIME:
if (DecodeTime(field[i], fmask, &tmask, tm, fsec) != 0) if (DecodeTime(field[i], fmask, &tmask, tm, fsec) != 0)
return -1; return -1;
...@@ -970,9 +968,29 @@ DecodeTimeOnly(char **field, int *ftype, int nf, ...@@ -970,9 +968,29 @@ DecodeTimeOnly(char **field, int *ftype, int nf,
case DTK_TZ: case DTK_TZ:
if (tzp == NULL) if (tzp == NULL)
return -1; return -1;
if (DecodeTimezone(field[i], tzp) != 0)
return -1; {
tmask = DTK_M(TZ); int tz;
if (DecodeTimezone(field[i], &tz) != 0)
return -1;
/* Already have a time zone?
* Then maybe this is the second field of a POSIX time:
* EST+3 (equivalent to PST)
*/
if ((i > 0) && ((fmask & DTK_M(TZ)) != 0)
&& (ftype[i-1] == DTK_TZ) && (isalpha(*field[i-1])))
{
*tzp -= tz;
tmask = 0;
}
else
{
*tzp = tz;
tmask = DTK_M(TZ);
}
}
break; break;
case DTK_NUMBER: case DTK_NUMBER:
...@@ -1015,6 +1033,41 @@ DecodeTimeOnly(char **field, int *ftype, int nf, ...@@ -1015,6 +1033,41 @@ DecodeTimeOnly(char **field, int *ftype, int nf,
break; break;
case DTZMOD:
/*
* daylight savings time modifier (solves "MET
* DST" syntax)
*/
tmask |= DTK_M(DTZ);
tm->tm_isdst = 1;
if (tzp == NULL)
return -1;
*tzp += val * 60;
break;
case DTZ:
/*
* set mask for TZ here _or_ check for DTZ later
* when getting default timezone
*/
tmask |= DTK_M(TZ);
tm->tm_isdst = 1;
if (tzp == NULL)
return -1;
*tzp = val * 60;
ftype[i] = DTK_TZ;
break;
case TZ:
tm->tm_isdst = 0;
if (tzp == NULL)
return -1;
*tzp = val * 60;
ftype[i] = DTK_TZ;
break;
case IGNORE: case IGNORE:
break; break;
...@@ -1486,6 +1539,47 @@ DecodeTimezone(char *str, int *tzp) ...@@ -1486,6 +1539,47 @@ DecodeTimezone(char *str, int *tzp)
} /* DecodeTimezone() */ } /* DecodeTimezone() */
/* DecodePosixTimezone()
* Interpret string as a POSIX-compatible timezone:
* PST-hh:mm
* PST+h
* - thomas 2000-03-15
*/
static int
DecodePosixTimezone(char *str, int *tzp)
{
int val, tz;
int type;
char *cp;
char delim;
cp = str;
while ((*cp != '\0') && isalpha(*cp))
cp++;
if (DecodeTimezone(cp, &tz) != 0)
return -1;
delim = *cp;
*cp = '\0';
type = DecodeSpecial(MAXDATEFIELDS-1, str, &val);
*cp = delim;
switch(type)
{
case DTZ:
case TZ:
*tzp = (val * 60) - tz;
break;
default:
return -1;
}
return 0;
} /* DecodePosixTimezone() */
/* DecodeSpecial() /* DecodeSpecial()
* Decode text string using lookup table. * Decode text string using lookup table.
* Implement a cache lookup since it is likely that dates * Implement a cache lookup since it is likely that dates
......
...@@ -20,29 +20,29 @@ INSERT INTO TEMP_TIMESTAMP (f1) ...@@ -20,29 +20,29 @@ INSERT INTO TEMP_TIMESTAMP (f1)
WHERE d1 BETWEEN '13-jun-1957' AND '1-jan-1997' WHERE d1 BETWEEN '13-jun-1957' AND '1-jan-1997'
OR d1 BETWEEN '1-jan-1999' AND '1-jan-2010'; OR d1 BETWEEN '1-jan-1999' AND '1-jan-2010';
SELECT '' AS "11", f1 AS timestamp SELECT '' AS "15", f1 AS timestamp
FROM TEMP_TIMESTAMP FROM TEMP_TIMESTAMP
ORDER BY timestamp; ORDER BY timestamp;
SELECT '' AS "110", d.f1 AS timestamp, t.f1 AS interval, d.f1 + t.f1 AS plus SELECT '' AS "150", d.f1 AS timestamp, t.f1 AS interval, d.f1 + t.f1 AS plus
FROM TEMP_TIMESTAMP d, INTERVAL_TBL t FROM TEMP_TIMESTAMP d, INTERVAL_TBL t
ORDER BY plus, timestamp, interval; ORDER BY plus, timestamp, interval;
SELECT '' AS "110", d.f1 AS timestamp, t.f1 AS interval, d.f1 - t.f1 AS minus SELECT '' AS "150", d.f1 AS timestamp, t.f1 AS interval, d.f1 - t.f1 AS minus
FROM TEMP_TIMESTAMP d, INTERVAL_TBL t FROM TEMP_TIMESTAMP d, INTERVAL_TBL t
WHERE isfinite(d.f1) WHERE isfinite(d.f1)
ORDER BY minus, timestamp, interval; ORDER BY minus, timestamp, interval;
SELECT '' AS "11", d.f1 AS timestamp, timestamp '1980-01-06 00:00 GMT' AS gpstime_zero, SELECT '' AS "15", d.f1 AS timestamp, timestamp '1980-01-06 00:00 GMT' AS gpstime_zero,
d.f1 - timestamp '1980-01-06 00:00 GMT' AS difference d.f1 - timestamp '1980-01-06 00:00 GMT' AS difference
FROM TEMP_TIMESTAMP d FROM TEMP_TIMESTAMP d
ORDER BY difference; ORDER BY difference;
SELECT '' AS "121", d1.f1 AS timestamp1, d2.f1 AS timestamp2, d1.f1 - d2.f1 AS difference SELECT '' AS "225", d1.f1 AS timestamp1, d2.f1 AS timestamp2, d1.f1 - d2.f1 AS difference
FROM TEMP_TIMESTAMP d1, TEMP_TIMESTAMP d2 FROM TEMP_TIMESTAMP d1, TEMP_TIMESTAMP d2
ORDER BY timestamp1, timestamp2, difference; ORDER BY timestamp1, timestamp2, difference;
SELECT '' as fifty, d1 as timestamp, SELECT '' as "54", d1 as timestamp,
date_part('year', d1) AS year, date_part('month', d1) AS month, date_part('year', d1) AS year, date_part('month', d1) AS month,
date_part('day',d1) AS day, date_part('hour', d1) AS hour, date_part('day',d1) AS day, date_part('hour', d1) AS hour,
date_part('minute', d1) AS minute, date_part('second', d1) AS second date_part('minute', d1) AS minute, date_part('second', d1) AS second
...@@ -66,12 +66,12 @@ SELECT '' AS four, f1 AS abstime, ...@@ -66,12 +66,12 @@ SELECT '' AS four, f1 AS abstime,
-- Conversions -- Conversions
-- --
SELECT '' AS "11", f1 AS timestamp, date( f1) AS date SELECT '' AS "15", f1 AS timestamp, date( f1) AS date
FROM TEMP_TIMESTAMP FROM TEMP_TIMESTAMP
WHERE f1 <> timestamp 'current' WHERE f1 <> timestamp 'current'
ORDER BY date; ORDER BY date;
SELECT '' AS "11", f1 AS timestamp, abstime( f1) AS abstime SELECT '' AS "15", f1 AS timestamp, abstime( f1) AS abstime
FROM TEMP_TIMESTAMP FROM TEMP_TIMESTAMP
ORDER BY abstime; ORDER BY abstime;
...@@ -102,13 +102,13 @@ SET DateStyle TO 'US,Postgres'; ...@@ -102,13 +102,13 @@ SET DateStyle TO 'US,Postgres';
SHOW DateStyle; SHOW DateStyle;
SELECT '' AS sixty_two, d1 AS us_postgres FROM TIMESTAMP_TBL; SELECT '' AS "66", d1 AS us_postgres FROM TIMESTAMP_TBL;
SELECT '' AS eight, f1 AS us_postgres FROM ABSTIME_TBL; SELECT '' AS eight, f1 AS us_postgres FROM ABSTIME_TBL;
SET DateStyle TO 'US,ISO'; SET DateStyle TO 'US,ISO';
SELECT '' AS sixty_two, d1 AS us_iso FROM TIMESTAMP_TBL; SELECT '' AS "66", d1 AS us_iso FROM TIMESTAMP_TBL;
SELECT '' AS eight, f1 AS us_iso FROM ABSTIME_TBL; SELECT '' AS eight, f1 AS us_iso FROM ABSTIME_TBL;
...@@ -116,7 +116,7 @@ SET DateStyle TO 'US,SQL'; ...@@ -116,7 +116,7 @@ SET DateStyle TO 'US,SQL';
SHOW DateStyle; SHOW DateStyle;
SELECT '' AS sixty_two, d1 AS us_sql FROM TIMESTAMP_TBL; SELECT '' AS "66", d1 AS us_sql FROM TIMESTAMP_TBL;
SELECT '' AS eight, f1 AS us_sql FROM ABSTIME_TBL; SELECT '' AS eight, f1 AS us_sql FROM ABSTIME_TBL;
...@@ -128,7 +128,7 @@ INSERT INTO TIMESTAMP_TBL VALUES('13/06/1957'); ...@@ -128,7 +128,7 @@ INSERT INTO TIMESTAMP_TBL VALUES('13/06/1957');
SELECT count(*) as one FROM TIMESTAMP_TBL WHERE d1 = 'Jun 13 1957'; SELECT count(*) as one FROM TIMESTAMP_TBL WHERE d1 = 'Jun 13 1957';
SELECT '' AS sixty_three, d1 AS european_postgres FROM TIMESTAMP_TBL; SELECT '' AS "67", d1 AS european_postgres FROM TIMESTAMP_TBL;
SELECT '' AS eight, f1 AS european_postgres FROM ABSTIME_TBL; SELECT '' AS eight, f1 AS european_postgres FROM ABSTIME_TBL;
...@@ -136,7 +136,7 @@ SET DateStyle TO 'European,ISO'; ...@@ -136,7 +136,7 @@ SET DateStyle TO 'European,ISO';
SHOW DateStyle; SHOW DateStyle;
SELECT '' AS sixty_three, d1 AS european_iso FROM TIMESTAMP_TBL; SELECT '' AS "67", d1 AS european_iso FROM TIMESTAMP_TBL;
SELECT '' AS eight, f1 AS european_iso FROM ABSTIME_TBL; SELECT '' AS eight, f1 AS european_iso FROM ABSTIME_TBL;
...@@ -144,7 +144,7 @@ SET DateStyle TO 'European,SQL'; ...@@ -144,7 +144,7 @@ SET DateStyle TO 'European,SQL';
SHOW DateStyle; SHOW DateStyle;
SELECT '' AS sixty_three, d1 AS european_sql FROM TIMESTAMP_TBL; SELECT '' AS "67", d1 AS european_sql FROM TIMESTAMP_TBL;
SELECT '' AS eight, f1 AS european_sql FROM ABSTIME_TBL; SELECT '' AS eight, f1 AS european_sql FROM ABSTIME_TBL;
......
...@@ -72,8 +72,11 @@ INSERT INTO TIMESTAMP_TBL VALUES ('19970210 173201 -0800'); ...@@ -72,8 +72,11 @@ INSERT INTO TIMESTAMP_TBL VALUES ('19970210 173201 -0800');
INSERT INTO TIMESTAMP_TBL VALUES ('1997-06-10 17:32:01 -07:00'); INSERT INTO TIMESTAMP_TBL VALUES ('1997-06-10 17:32:01 -07:00');
-- POSIX format -- POSIX format
INSERT INTO TIMESTAMP_TBL VALUES ('2000-02-15 23:14:30 GMT+8'); INSERT INTO TIMESTAMP_TBL VALUES ('2000-03-15 08:14:01 GMT+8');
INSERT INTO TIMESTAMP_TBL VALUES ('2000-02-15 23:14:30 EST+3'); INSERT INTO TIMESTAMP_TBL VALUES ('2000-03-15 13:14:02 GMT-1');
INSERT INTO TIMESTAMP_TBL VALUES ('2000-03-15 12:14:03 GMT -2');
INSERT INTO TIMESTAMP_TBL VALUES ('2000-03-15 03:14:04 EST+3');
INSERT INTO TIMESTAMP_TBL VALUES ('2000-03-15 02:14:05 EST +2:00');
-- Variations for acceptable input formats -- Variations for acceptable input formats
INSERT INTO TIMESTAMP_TBL VALUES ('Feb 10 17:32:01 1997 -0800'); INSERT INTO TIMESTAMP_TBL VALUES ('Feb 10 17:32:01 1997 -0800');
...@@ -129,43 +132,45 @@ INSERT INTO TIMESTAMP_TBL VALUES ('Jan 01 17:32:01 2001'); ...@@ -129,43 +132,45 @@ INSERT INTO TIMESTAMP_TBL VALUES ('Jan 01 17:32:01 2001');
INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 -0097'); INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 -0097');
INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 5097 BC'); INSERT INTO TIMESTAMP_TBL VALUES ('Feb 16 17:32:01 5097 BC');
SELECT '' AS sixtythree, d1 FROM TIMESTAMP_TBL; SELECT '' AS "66", d1 FROM TIMESTAMP_TBL;
-- Demonstrate functions and operators -- Demonstrate functions and operators
SELECT '' AS fortythree, d1 FROM TIMESTAMP_TBL SELECT '' AS "47", d1 FROM TIMESTAMP_TBL
WHERE d1 > timestamp '1997-01-02' and d1 != timestamp 'current'; WHERE d1 > timestamp '1997-01-02' and d1 != timestamp 'current';
SELECT '' AS fifteen, d1 FROM TIMESTAMP_TBL SELECT '' AS "15", d1 FROM TIMESTAMP_TBL
WHERE d1 < timestamp '1997-01-02' and d1 != timestamp 'current'; WHERE d1 < timestamp '1997-01-02' and d1 != timestamp 'current';
SELECT '' AS one, d1 FROM TIMESTAMP_TBL SELECT '' AS one, d1 FROM TIMESTAMP_TBL
WHERE d1 = timestamp '1997-01-02' and d1 != timestamp 'current'; WHERE d1 = timestamp '1997-01-02' and d1 != timestamp 'current';
SELECT '' AS fiftyeight, d1 FROM TIMESTAMP_TBL SELECT '' AS "62", d1 FROM TIMESTAMP_TBL
WHERE d1 != timestamp '1997-01-02' and d1 != timestamp 'current'; WHERE d1 != timestamp '1997-01-02' and d1 != timestamp 'current';
SELECT '' AS sixteen, d1 FROM TIMESTAMP_TBL SELECT '' AS "16", d1 FROM TIMESTAMP_TBL
WHERE d1 <= timestamp '1997-01-02' and d1 != timestamp 'current'; WHERE d1 <= timestamp '1997-01-02' and d1 != timestamp 'current';
SELECT '' AS fortyfour, d1 FROM TIMESTAMP_TBL SELECT '' AS "48", d1 FROM TIMESTAMP_TBL
WHERE d1 >= timestamp '1997-01-02' and d1 != timestamp 'current'; WHERE d1 >= timestamp '1997-01-02' and d1 != timestamp 'current';
SELECT '' AS sixtythree, d1 + interval '1 year' AS one_year FROM TIMESTAMP_TBL; SELECT '' AS "66", d1 + interval '1 year' AS one_year FROM TIMESTAMP_TBL;
SELECT '' AS sixtythree, d1 - interval '1 year' AS one_year FROM TIMESTAMP_TBL; SELECT '' AS "66", d1 - interval '1 year' AS one_year FROM TIMESTAMP_TBL;
-- Casting within a BETWEEN qualifier should probably be allowed by the parser. - tgl 97/04/26 SELECT '' AS "53", d1 - timestamp '1997-01-02' AS diff
--SELECT '' AS fifty, d1 - timestamp '1997-01-02' AS diff
-- FROM TIMESTAMP_TBL WHERE d1 BETWEEN timestamp '1902-01-01' AND timestamp '2038-01-01';
SELECT '' AS fifty, d1 - timestamp '1997-01-02' AS diff
FROM TIMESTAMP_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01'; FROM TIMESTAMP_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01';
SELECT '' AS fortynine, date_part( 'year', d1) AS year, date_part( 'month', d1) AS month, -- Test casting within a BETWEEN qualifier
SELECT '' AS "53", d1 - timestamp '1997-01-02' AS diff
FROM TIMESTAMP_TBL
WHERE d1 BETWEEN timestamp '1902-01-01' AND timestamp '2038-01-01';
SELECT '' AS "53", date_part( 'year', d1) AS year, date_part( 'month', d1) AS month,
date_part( 'day', d1) AS day, date_part( 'hour', d1) AS hour, date_part( 'day', d1) AS day, date_part( 'hour', d1) AS hour,
date_part( 'minute', d1) AS minute, date_part( 'second', d1) AS second date_part( 'minute', d1) AS minute, date_part( 'second', d1) AS second
FROM TIMESTAMP_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01'; FROM TIMESTAMP_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01';
SELECT '' AS fortynine, date_part( 'quarter', d1) AS quarter, date_part( 'msec', d1) AS msec, SELECT '' AS "53", date_part( 'quarter', d1) AS quarter, date_part( 'msec', d1) AS msec,
date_part( 'usec', d1) AS usec date_part( 'usec', d1) AS usec
FROM TIMESTAMP_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01'; FROM TIMESTAMP_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01';
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment