-- -- INTERVAL -- SET DATESTYLE = 'ISO'; -- check acceptance of "time zone style" SELECT INTERVAL '01:00' AS "One hour"; One hour ---------- 01:00:00 (1 row) SELECT INTERVAL '+02:00' AS "Two hours"; Two hours ----------- 02:00:00 (1 row) SELECT INTERVAL '-08:00' AS "Eight hours"; Eight hours ------------- -08:00:00 (1 row) SELECT INTERVAL '-05' AS "Five hours"; Five hours ------------ -05:00:00 (1 row) SELECT INTERVAL '-1 +02:03' AS "22 hours ago..."; 22 hours ago... ------------------- -1 days +02:03:00 (1 row) SELECT INTERVAL '-1 days +02:03' AS "22 hours ago..."; 22 hours ago... ------------------- -1 days +02:03:00 (1 row) SELECT INTERVAL '10 years -11 month -12 days +13:14' AS "9 years..."; 9 years... ---------------------------------- 9 years 1 mon -12 days +13:14:00 (1 row) CREATE TABLE INTERVAL_TBL (f1 interval); INSERT INTO INTERVAL_TBL (f1) VALUES ('@ 1 minute'); INSERT INTO INTERVAL_TBL (f1) VALUES ('@ 5 hour'); INSERT INTO INTERVAL_TBL (f1) VALUES ('@ 10 day'); INSERT INTO INTERVAL_TBL (f1) VALUES ('@ 34 year'); INSERT INTO INTERVAL_TBL (f1) VALUES ('@ 3 months'); INSERT INTO INTERVAL_TBL (f1) VALUES ('@ 14 seconds ago'); INSERT INTO INTERVAL_TBL (f1) VALUES ('1 day 2 hours 3 minutes 4 seconds'); INSERT INTO INTERVAL_TBL (f1) VALUES ('6 years'); INSERT INTO INTERVAL_TBL (f1) VALUES ('5 months'); INSERT INTO INTERVAL_TBL (f1) VALUES ('5 months 12 hours'); -- badly formatted interval INSERT INTO INTERVAL_TBL (f1) VALUES ('badly formatted interval'); ERROR: invalid input syntax for type interval: "badly formatted interval" INSERT INTO INTERVAL_TBL (f1) VALUES ('@ 30 eons ago'); ERROR: invalid input syntax for type interval: "@ 30 eons ago" -- test interval operators SELECT '' AS ten, * FROM INTERVAL_TBL; ten | f1 -----+----------------- | 00:01:00 | 05:00:00 | 10 days | 34 years | 3 mons | -00:00:14 | 1 day 02:03:04 | 6 years | 5 mons | 5 mons 12:00:00 (10 rows) SELECT '' AS nine, * FROM INTERVAL_TBL WHERE INTERVAL_TBL.f1 <> interval '@ 10 days'; nine | f1 ------+----------------- | 00:01:00 | 05:00:00 | 34 years | 3 mons | -00:00:14 | 1 day 02:03:04 | 6 years | 5 mons | 5 mons 12:00:00 (9 rows) SELECT '' AS three, * FROM INTERVAL_TBL WHERE INTERVAL_TBL.f1 <= interval '@ 5 hours'; three | f1 -------+----------- | 00:01:00 | 05:00:00 | -00:00:14 (3 rows) SELECT '' AS three, * FROM INTERVAL_TBL WHERE INTERVAL_TBL.f1 < interval '@ 1 day'; three | f1 -------+----------- | 00:01:00 | 05:00:00 | -00:00:14 (3 rows) SELECT '' AS one, * FROM INTERVAL_TBL WHERE INTERVAL_TBL.f1 = interval '@ 34 years'; one | f1 -----+---------- | 34 years (1 row) SELECT '' AS five, * FROM INTERVAL_TBL WHERE INTERVAL_TBL.f1 >= interval '@ 1 month'; five | f1 ------+----------------- | 34 years | 3 mons | 6 years | 5 mons | 5 mons 12:00:00 (5 rows) SELECT '' AS nine, * FROM INTERVAL_TBL WHERE INTERVAL_TBL.f1 > interval '@ 3 seconds ago'; nine | f1 ------+----------------- | 00:01:00 | 05:00:00 | 10 days | 34 years | 3 mons | 1 day 02:03:04 | 6 years | 5 mons | 5 mons 12:00:00 (9 rows) SELECT '' AS fortyfive, r1.*, r2.* FROM INTERVAL_TBL r1, INTERVAL_TBL r2 WHERE r1.f1 > r2.f1 ORDER BY r1.f1, r2.f1; fortyfive | f1 | f1 -----------+-----------------+----------------- | 00:01:00 | -00:00:14 | 05:00:00 | -00:00:14 | 05:00:00 | 00:01:00 | 1 day 02:03:04 | -00:00:14 | 1 day 02:03:04 | 00:01:00 | 1 day 02:03:04 | 05:00:00 | 10 days | -00:00:14 | 10 days | 00:01:00 | 10 days | 05:00:00 | 10 days | 1 day 02:03:04 | 3 mons | -00:00:14 | 3 mons | 00:01:00 | 3 mons | 05:00:00 | 3 mons | 1 day 02:03:04 | 3 mons | 10 days | 5 mons | -00:00:14 | 5 mons | 00:01:00 | 5 mons | 05:00:00 | 5 mons | 1 day 02:03:04 | 5 mons | 10 days | 5 mons | 3 mons | 5 mons 12:00:00 | -00:00:14 | 5 mons 12:00:00 | 00:01:00 | 5 mons 12:00:00 | 05:00:00 | 5 mons 12:00:00 | 1 day 02:03:04 | 5 mons 12:00:00 | 10 days | 5 mons 12:00:00 | 3 mons | 5 mons 12:00:00 | 5 mons | 6 years | -00:00:14 | 6 years | 00:01:00 | 6 years | 05:00:00 | 6 years | 1 day 02:03:04 | 6 years | 10 days | 6 years | 3 mons | 6 years | 5 mons | 6 years | 5 mons 12:00:00 | 34 years | -00:00:14 | 34 years | 00:01:00 | 34 years | 05:00:00 | 34 years | 1 day 02:03:04 | 34 years | 10 days | 34 years | 3 mons | 34 years | 5 mons | 34 years | 5 mons 12:00:00 | 34 years | 6 years (45 rows) SET DATESTYLE = 'postgres'; SELECT '' AS ten, * FROM INTERVAL_TBL; ten | f1 -----+------------------------------- | @ 1 min | @ 5 hours | @ 10 days | @ 34 years | @ 3 mons | @ 14 secs ago | @ 1 day 2 hours 3 mins 4 secs | @ 6 years | @ 5 mons | @ 5 mons 12 hours (10 rows) -- test avg(interval), which is somewhat fragile since people have been -- known to change the allowed input syntax for type interval without -- updating pg_aggregate.agginitval select avg(f1) from interval_tbl; avg ------------------------------------------------- @ 4 years 1 mon 9 days 28 hours 18 mins 23 secs (1 row) -- test long interval input select '4 millenniums 5 centuries 4 decades 1 year 4 months 4 days 17 minutes 31 seconds'::interval; interval -------------------------------------------- @ 4541 years 4 mons 4 days 17 mins 31 secs (1 row) -- test justify_hours() and justify_days() SELECT justify_hours(interval '6 months 3 days 52 hours 3 minutes 2 seconds') as "6 mons 5 days 4 hours 3 mins 2 seconds"; 6 mons 5 days 4 hours 3 mins 2 seconds ---------------------------------------- @ 6 mons 5 days 4 hours 3 mins 2 secs (1 row) SELECT justify_days(interval '6 months 36 days 5 hours 4 minutes 3 seconds') as "7 mons 6 days 5 hours 4 mins 3 seconds"; 7 mons 6 days 5 hours 4 mins 3 seconds ---------------------------------------- @ 7 mons 6 days 5 hours 4 mins 3 secs (1 row)