-- *** testing new built-in time types: datetime, timespan ***

-- Shorthand values
-- Not directly usable for regression testing since these are not constants.
-- So, just try to test parser and hope for the best - tgl 97/04/26

SELECT ('today'::datetime = ('yesterday'::datetime + '1 day'::timespan)) as "True";
SELECT ('today'::datetime = ('tomorrow'::datetime - '1 day'::timespan)) as "True";
SELECT ('tomorrow'::datetime = ('yesterday'::datetime + '2 days'::timespan)) as "True";
SELECT ('current'::datetime = 'now'::datetime) as "True";
SELECT ('now'::datetime - 'current'::datetime) AS "ZeroSecs";

SET DateStyle = 'Postgres,noneuropean';
SELECT datetime('1994-01-01', '11:00') AS "Jan_01_1994_11am";

CREATE TABLE DATETIME_TBL( d1 datetime);

INSERT INTO DATETIME_TBL VALUES ('current');
INSERT INTO DATETIME_TBL VALUES ('today');
INSERT INTO DATETIME_TBL VALUES ('yesterday');
INSERT INTO DATETIME_TBL VALUES ('tomorrow');
INSERT INTO DATETIME_TBL VALUES ('tomorrow EST');
INSERT INTO DATETIME_TBL VALUES ('tomorrow zulu');

SELECT count(*) AS one FROM DATETIME_TBL WHERE d1 = 'today'::datetime;
SELECT count(*) AS one FROM DATETIME_TBL WHERE d1 = 'tomorrow'::datetime;
SELECT count(*) AS one FROM DATETIME_TBL WHERE d1 = 'yesterday'::datetime;
SELECT count(*) AS one FROM DATETIME_TBL WHERE d1 = 'today'::datetime + '1 day'::timespan;
SELECT count(*) AS one FROM DATETIME_TBL WHERE d1 = 'today'::datetime - '1 day'::timespan;

SELECT count(*) AS one FROM DATETIME_TBL WHERE d1 = 'now'::datetime;

DELETE FROM DATETIME_TBL;

-- verify uniform transaction time within transaction block
INSERT INTO DATETIME_TBL VALUES ('current');
BEGIN;
INSERT INTO DATETIME_TBL VALUES ('now');
SELECT count(*) AS two FROM DATETIME_TBL WHERE d1 = 'now'::datetime;
END;
DELETE FROM DATETIME_TBL;

-- Special values
INSERT INTO DATETIME_TBL VALUES ('invalid');
INSERT INTO DATETIME_TBL VALUES ('-infinity');
INSERT INTO DATETIME_TBL VALUES ('infinity');
INSERT INTO DATETIME_TBL VALUES ('epoch');

-- Postgres v6.0 standard output format
INSERT INTO DATETIME_TBL VALUES ('Mon Feb 10 17:32:01 1997 PST');
INSERT INTO DATETIME_TBL VALUES ('Invalid Abstime');
INSERT INTO DATETIME_TBL VALUES ('Undefined Abstime');

-- Variations on Postgres v6.1 standard output format
INSERT INTO DATETIME_TBL VALUES ('Mon Feb 10 17:32:01.000001 1997 PST');
INSERT INTO DATETIME_TBL VALUES ('Mon Feb 10 17:32:01.999999 1997 PST');
INSERT INTO DATETIME_TBL VALUES ('Mon Feb 10 17:32:01.4 1997 PST');
INSERT INTO DATETIME_TBL VALUES ('Mon Feb 10 17:32:01.5 1997 PST');
INSERT INTO DATETIME_TBL VALUES ('Mon Feb 10 17:32:01.6 1997 PST');

-- ISO 8601 format
INSERT INTO DATETIME_TBL VALUES ('1997-01-02');
INSERT INTO DATETIME_TBL VALUES ('1997-01-02 03:04:05');
INSERT INTO DATETIME_TBL VALUES ('1997-02-10 17:32:01-08');
INSERT INTO DATETIME_TBL VALUES ('1997-02-10 17:32:01-0800');
INSERT INTO DATETIME_TBL VALUES ('1997-02-10 17:32:01 -08:00');
INSERT INTO DATETIME_TBL VALUES ('19970210 173201 -0800');
INSERT INTO DATETIME_TBL VALUES ('1997-06-10 17:32:01 -07:00');

-- Variations for acceptable input formats
INSERT INTO DATETIME_TBL VALUES ('Feb 10 17:32:01 1997 -0800');
INSERT INTO DATETIME_TBL VALUES ('Feb 10 17:32:01 1997');
INSERT INTO DATETIME_TBL VALUES ('Feb 10 5:32PM 1997');
INSERT INTO DATETIME_TBL VALUES ('1997/02/10 17:32:01-0800');
INSERT INTO DATETIME_TBL VALUES ('1997-02-10 17:32:01 PST');
INSERT INTO DATETIME_TBL VALUES ('Feb-10-1997 17:32:01 PST');
INSERT INTO DATETIME_TBL VALUES ('02-10-1997 17:32:01 PST');
INSERT INTO DATETIME_TBL VALUES ('19970210 173201 PST');
INSERT INTO DATETIME_TBL VALUES ('97FEB10 5:32:01PM UTC');
INSERT INTO DATETIME_TBL VALUES ('97/02/10 17:32:01 UTC');
INSERT INTO DATETIME_TBL VALUES ('97.041 17:32:01 UTC');

-- Check date conversion and date arithmetic
INSERT INTO DATETIME_TBL VALUES ('1997-06-10 18:32:01 PDT');

INSERT INTO DATETIME_TBL VALUES ('Feb 10 17:32:01 1997');
INSERT INTO DATETIME_TBL VALUES ('Feb 11 17:32:01 1997');
INSERT INTO DATETIME_TBL VALUES ('Feb 12 17:32:01 1997');
INSERT INTO DATETIME_TBL VALUES ('Feb 13 17:32:01 1997');
INSERT INTO DATETIME_TBL VALUES ('Feb 14 17:32:01 1997');
INSERT INTO DATETIME_TBL VALUES ('Feb 15 17:32:01 1997');
INSERT INTO DATETIME_TBL VALUES ('Feb 16 17:32:01 1997');

INSERT INTO DATETIME_TBL VALUES ('Feb 16 17:32:01 0097 BC');
INSERT INTO DATETIME_TBL VALUES ('Feb 16 17:32:01 0097');
INSERT INTO DATETIME_TBL VALUES ('Feb 16 17:32:01 0597');
INSERT INTO DATETIME_TBL VALUES ('Feb 16 17:32:01 1097');
INSERT INTO DATETIME_TBL VALUES ('Feb 16 17:32:01 1697');
INSERT INTO DATETIME_TBL VALUES ('Feb 16 17:32:01 1797');
INSERT INTO DATETIME_TBL VALUES ('Feb 16 17:32:01 1897');
INSERT INTO DATETIME_TBL VALUES ('Feb 16 17:32:01 1997');
INSERT INTO DATETIME_TBL VALUES ('Feb 16 17:32:01 2097');

INSERT INTO DATETIME_TBL VALUES ('Feb 28 17:32:01 1996');
INSERT INTO DATETIME_TBL VALUES ('Feb 29 17:32:01 1996');
INSERT INTO DATETIME_TBL VALUES ('Mar 01 17:32:01 1996');
INSERT INTO DATETIME_TBL VALUES ('Dec 30 17:32:01 1996');
INSERT INTO DATETIME_TBL VALUES ('Dec 31 17:32:01 1996');
INSERT INTO DATETIME_TBL VALUES ('Jan 01 17:32:01 1997');
INSERT INTO DATETIME_TBL VALUES ('Feb 28 17:32:01 1997');
INSERT INTO DATETIME_TBL VALUES ('Feb 29 17:32:01 1997');
INSERT INTO DATETIME_TBL VALUES ('Mar 01 17:32:01 1997');
INSERT INTO DATETIME_TBL VALUES ('Dec 30 17:32:01 1997');
INSERT INTO DATETIME_TBL VALUES ('Dec 31 17:32:01 1997');
INSERT INTO DATETIME_TBL VALUES ('Dec 31 17:32:01 1999');
INSERT INTO DATETIME_TBL VALUES ('Jan 01 17:32:01 2000');
INSERT INTO DATETIME_TBL VALUES ('Dec 31 17:32:01 2000');
INSERT INTO DATETIME_TBL VALUES ('Jan 01 17:32:01 2001');

-- Currently unsupported syntax and ranges
INSERT INTO DATETIME_TBL VALUES ('Feb 16 17:32:01 -0097');
INSERT INTO DATETIME_TBL VALUES ('Feb 16 17:32:01 5097 BC');

SELECT '' AS sixtythree, d1 FROM DATETIME_TBL; 

-- Demonstrate functions and operators
SELECT '' AS fortythree, d1 FROM DATETIME_TBL
   WHERE d1 > '1997-01-02'::datetime and d1 != 'current'::datetime;

SELECT '' AS fifteen, d1 FROM DATETIME_TBL
   WHERE d1 < '1997-01-02'::datetime and d1 != 'current'::datetime;

SELECT '' AS one, d1 FROM DATETIME_TBL
   WHERE d1 = '1997-01-02'::datetime and d1 != 'current'::datetime;

SELECT '' AS fiftyeight, d1 FROM DATETIME_TBL
   WHERE d1 != '1997-01-02'::datetime and d1 != 'current'::datetime;

SELECT '' AS sixteen, d1 FROM DATETIME_TBL
   WHERE d1 <= '1997-01-02'::datetime and d1 != 'current'::datetime;

SELECT '' AS fortyfour, d1 FROM DATETIME_TBL
   WHERE d1 >= '1997-01-02'::datetime and d1 != 'current'::datetime;

SELECT '' AS sixtythree, d1 + '1 year'::timespan AS one_year FROM DATETIME_TBL;

SELECT '' AS sixtythree, d1 - '1 year'::timespan AS one_year FROM DATETIME_TBL;

-- Casting within a BETWEEN qualifier should probably be allowed by the parser. - tgl 97/04/26
--SELECT '' AS fifty, d1 - '1997-01-02'::datetime AS diff
--   FROM DATETIME_TBL WHERE d1 BETWEEN '1902-01-01'::datetime AND '2038-01-01'::datetime;
SELECT '' AS fifty, d1 - '1997-01-02'::datetime AS diff
   FROM DATETIME_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,
   date_part( 'day', d1) AS day, date_part( 'hour', d1) AS hour,
   date_part( 'minute', d1) AS minute, date_part( 'second', d1) AS second
   FROM DATETIME_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,
   date_part( 'usec', d1) AS usec
   FROM DATETIME_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01';

