1-- 2-- DATE 3-- 4 5CREATE TABLE DATE_TBL (f1 date); 6 7INSERT INTO DATE_TBL VALUES ('1957-04-09'); 8INSERT INTO DATE_TBL VALUES ('1957-06-13'); 9INSERT INTO DATE_TBL VALUES ('1996-02-28'); 10INSERT INTO DATE_TBL VALUES ('1996-02-29'); 11INSERT INTO DATE_TBL VALUES ('1996-03-01'); 12INSERT INTO DATE_TBL VALUES ('1996-03-02'); 13INSERT INTO DATE_TBL VALUES ('1997-02-28'); 14INSERT INTO DATE_TBL VALUES ('1997-02-29'); 15INSERT INTO DATE_TBL VALUES ('1997-03-01'); 16INSERT INTO DATE_TBL VALUES ('1997-03-02'); 17INSERT INTO DATE_TBL VALUES ('2000-04-01'); 18INSERT INTO DATE_TBL VALUES ('2000-04-02'); 19INSERT INTO DATE_TBL VALUES ('2000-04-03'); 20INSERT INTO DATE_TBL VALUES ('2038-04-08'); 21INSERT INTO DATE_TBL VALUES ('2039-04-09'); 22INSERT INTO DATE_TBL VALUES ('2040-04-10'); 23 24SELECT f1 AS "Fifteen" FROM DATE_TBL; 25 26SELECT f1 AS "Nine" FROM DATE_TBL WHERE f1 < '2000-01-01'; 27 28SELECT f1 AS "Three" FROM DATE_TBL 29 WHERE f1 BETWEEN '2000-01-01' AND '2001-01-01'; 30 31-- 32-- Check all the documented input formats 33-- 34SET datestyle TO iso; -- display results in ISO 35 36SET datestyle TO ymd; 37 38SELECT date 'January 8, 1999'; 39SELECT date '1999-01-08'; 40SELECT date '1999-01-18'; 41SELECT date '1/8/1999'; 42SELECT date '1/18/1999'; 43SELECT date '18/1/1999'; 44SELECT date '01/02/03'; 45SELECT date '19990108'; 46SELECT date '990108'; 47SELECT date '1999.008'; 48SELECT date 'J2451187'; 49SELECT date 'January 8, 99 BC'; 50 51SELECT date '99-Jan-08'; 52SELECT date '1999-Jan-08'; 53SELECT date '08-Jan-99'; 54SELECT date '08-Jan-1999'; 55SELECT date 'Jan-08-99'; 56SELECT date 'Jan-08-1999'; 57SELECT date '99-08-Jan'; 58SELECT date '1999-08-Jan'; 59 60SELECT date '99 Jan 08'; 61SELECT date '1999 Jan 08'; 62SELECT date '08 Jan 99'; 63SELECT date '08 Jan 1999'; 64SELECT date 'Jan 08 99'; 65SELECT date 'Jan 08 1999'; 66SELECT date '99 08 Jan'; 67SELECT date '1999 08 Jan'; 68 69SELECT date '99-01-08'; 70SELECT date '1999-01-08'; 71SELECT date '08-01-99'; 72SELECT date '08-01-1999'; 73SELECT date '01-08-99'; 74SELECT date '01-08-1999'; 75SELECT date '99-08-01'; 76SELECT date '1999-08-01'; 77 78SELECT date '99 01 08'; 79SELECT date '1999 01 08'; 80SELECT date '08 01 99'; 81SELECT date '08 01 1999'; 82SELECT date '01 08 99'; 83SELECT date '01 08 1999'; 84SELECT date '99 08 01'; 85SELECT date '1999 08 01'; 86 87SET datestyle TO dmy; 88 89SELECT date 'January 8, 1999'; 90SELECT date '1999-01-08'; 91SELECT date '1999-01-18'; 92SELECT date '1/8/1999'; 93SELECT date '1/18/1999'; 94SELECT date '18/1/1999'; 95SELECT date '01/02/03'; 96SELECT date '19990108'; 97SELECT date '990108'; 98SELECT date '1999.008'; 99SELECT date 'J2451187'; 100SELECT date 'January 8, 99 BC'; 101 102SELECT date '99-Jan-08'; 103SELECT date '1999-Jan-08'; 104SELECT date '08-Jan-99'; 105SELECT date '08-Jan-1999'; 106SELECT date 'Jan-08-99'; 107SELECT date 'Jan-08-1999'; 108SELECT date '99-08-Jan'; 109SELECT date '1999-08-Jan'; 110 111SELECT date '99 Jan 08'; 112SELECT date '1999 Jan 08'; 113SELECT date '08 Jan 99'; 114SELECT date '08 Jan 1999'; 115SELECT date 'Jan 08 99'; 116SELECT date 'Jan 08 1999'; 117SELECT date '99 08 Jan'; 118SELECT date '1999 08 Jan'; 119 120SELECT date '99-01-08'; 121SELECT date '1999-01-08'; 122SELECT date '08-01-99'; 123SELECT date '08-01-1999'; 124SELECT date '01-08-99'; 125SELECT date '01-08-1999'; 126SELECT date '99-08-01'; 127SELECT date '1999-08-01'; 128 129SELECT date '99 01 08'; 130SELECT date '1999 01 08'; 131SELECT date '08 01 99'; 132SELECT date '08 01 1999'; 133SELECT date '01 08 99'; 134SELECT date '01 08 1999'; 135SELECT date '99 08 01'; 136SELECT date '1999 08 01'; 137 138SET datestyle TO mdy; 139 140SELECT date 'January 8, 1999'; 141SELECT date '1999-01-08'; 142SELECT date '1999-01-18'; 143SELECT date '1/8/1999'; 144SELECT date '1/18/1999'; 145SELECT date '18/1/1999'; 146SELECT date '01/02/03'; 147SELECT date '19990108'; 148SELECT date '990108'; 149SELECT date '1999.008'; 150SELECT date 'J2451187'; 151SELECT date 'January 8, 99 BC'; 152 153SELECT date '99-Jan-08'; 154SELECT date '1999-Jan-08'; 155SELECT date '08-Jan-99'; 156SELECT date '08-Jan-1999'; 157SELECT date 'Jan-08-99'; 158SELECT date 'Jan-08-1999'; 159SELECT date '99-08-Jan'; 160SELECT date '1999-08-Jan'; 161 162SELECT date '99 Jan 08'; 163SELECT date '1999 Jan 08'; 164SELECT date '08 Jan 99'; 165SELECT date '08 Jan 1999'; 166SELECT date 'Jan 08 99'; 167SELECT date 'Jan 08 1999'; 168SELECT date '99 08 Jan'; 169SELECT date '1999 08 Jan'; 170 171SELECT date '99-01-08'; 172SELECT date '1999-01-08'; 173SELECT date '08-01-99'; 174SELECT date '08-01-1999'; 175SELECT date '01-08-99'; 176SELECT date '01-08-1999'; 177SELECT date '99-08-01'; 178SELECT date '1999-08-01'; 179 180SELECT date '99 01 08'; 181SELECT date '1999 01 08'; 182SELECT date '08 01 99'; 183SELECT date '08 01 1999'; 184SELECT date '01 08 99'; 185SELECT date '01 08 1999'; 186SELECT date '99 08 01'; 187SELECT date '1999 08 01'; 188 189-- Check upper and lower limits of date range 190SELECT date '4714-11-24 BC'; 191SELECT date '4714-11-23 BC'; -- out of range 192SELECT date '5874897-12-31'; 193SELECT date '5874898-01-01'; -- out of range 194 195RESET datestyle; 196 197-- 198-- Simple math 199-- Leave most of it for the horology tests 200-- 201 202SELECT f1 - date '2000-01-01' AS "Days From 2K" FROM DATE_TBL; 203 204SELECT f1 - date 'epoch' AS "Days From Epoch" FROM DATE_TBL; 205 206SELECT date 'yesterday' - date 'today' AS "One day"; 207 208SELECT date 'today' - date 'tomorrow' AS "One day"; 209 210SELECT date 'yesterday' - date 'tomorrow' AS "Two days"; 211 212SELECT date 'tomorrow' - date 'today' AS "One day"; 213 214SELECT date 'today' - date 'yesterday' AS "One day"; 215 216SELECT date 'tomorrow' - date 'yesterday' AS "Two days"; 217 218-- 219-- test extract! 220-- 221-- epoch 222-- 223SELECT EXTRACT(EPOCH FROM DATE '1970-01-01'); -- 0 224SELECT EXTRACT(EPOCH FROM TIMESTAMP '1970-01-01'); -- 0 225SELECT EXTRACT(EPOCH FROM TIMESTAMPTZ '1970-01-01+00'); -- 0 226-- 227-- century 228-- 229SELECT EXTRACT(CENTURY FROM DATE '0101-12-31 BC'); -- -2 230SELECT EXTRACT(CENTURY FROM DATE '0100-12-31 BC'); -- -1 231SELECT EXTRACT(CENTURY FROM DATE '0001-12-31 BC'); -- -1 232SELECT EXTRACT(CENTURY FROM DATE '0001-01-01'); -- 1 233SELECT EXTRACT(CENTURY FROM DATE '0001-01-01 AD'); -- 1 234SELECT EXTRACT(CENTURY FROM DATE '1900-12-31'); -- 19 235SELECT EXTRACT(CENTURY FROM DATE '1901-01-01'); -- 20 236SELECT EXTRACT(CENTURY FROM DATE '2000-12-31'); -- 20 237SELECT EXTRACT(CENTURY FROM DATE '2001-01-01'); -- 21 238SELECT EXTRACT(CENTURY FROM CURRENT_DATE)>=21 AS True; -- true 239-- 240-- millennium 241-- 242SELECT EXTRACT(MILLENNIUM FROM DATE '0001-12-31 BC'); -- -1 243SELECT EXTRACT(MILLENNIUM FROM DATE '0001-01-01 AD'); -- 1 244SELECT EXTRACT(MILLENNIUM FROM DATE '1000-12-31'); -- 1 245SELECT EXTRACT(MILLENNIUM FROM DATE '1001-01-01'); -- 2 246SELECT EXTRACT(MILLENNIUM FROM DATE '2000-12-31'); -- 2 247SELECT EXTRACT(MILLENNIUM FROM DATE '2001-01-01'); -- 3 248-- next test to be fixed on the turn of the next millennium;-) 249SELECT EXTRACT(MILLENNIUM FROM CURRENT_DATE); -- 3 250-- 251-- decade 252-- 253SELECT EXTRACT(DECADE FROM DATE '1994-12-25'); -- 199 254SELECT EXTRACT(DECADE FROM DATE '0010-01-01'); -- 1 255SELECT EXTRACT(DECADE FROM DATE '0009-12-31'); -- 0 256SELECT EXTRACT(DECADE FROM DATE '0001-01-01 BC'); -- 0 257SELECT EXTRACT(DECADE FROM DATE '0002-12-31 BC'); -- -1 258SELECT EXTRACT(DECADE FROM DATE '0011-01-01 BC'); -- -1 259SELECT EXTRACT(DECADE FROM DATE '0012-12-31 BC'); -- -2 260-- 261-- some other types: 262-- 263-- on a timestamp. 264SELECT EXTRACT(CENTURY FROM NOW())>=21 AS True; -- true 265SELECT EXTRACT(CENTURY FROM TIMESTAMP '1970-03-20 04:30:00.00000'); -- 20 266-- on an interval 267SELECT EXTRACT(CENTURY FROM INTERVAL '100 y'); -- 1 268SELECT EXTRACT(CENTURY FROM INTERVAL '99 y'); -- 0 269SELECT EXTRACT(CENTURY FROM INTERVAL '-99 y'); -- 0 270SELECT EXTRACT(CENTURY FROM INTERVAL '-100 y'); -- -1 271-- 272-- test trunc function! 273-- 274SELECT DATE_TRUNC('MILLENNIUM', TIMESTAMP '1970-03-20 04:30:00.00000'); -- 1001 275SELECT DATE_TRUNC('MILLENNIUM', DATE '1970-03-20'); -- 1001-01-01 276SELECT DATE_TRUNC('CENTURY', TIMESTAMP '1970-03-20 04:30:00.00000'); -- 1901 277SELECT DATE_TRUNC('CENTURY', DATE '1970-03-20'); -- 1901 278SELECT DATE_TRUNC('CENTURY', DATE '2004-08-10'); -- 2001-01-01 279SELECT DATE_TRUNC('CENTURY', DATE '0002-02-04'); -- 0001-01-01 280SELECT DATE_TRUNC('CENTURY', DATE '0055-08-10 BC'); -- 0100-01-01 BC 281SELECT DATE_TRUNC('DECADE', DATE '1993-12-25'); -- 1990-01-01 282SELECT DATE_TRUNC('DECADE', DATE '0004-12-25'); -- 0001-01-01 BC 283SELECT DATE_TRUNC('DECADE', DATE '0002-12-31 BC'); -- 0011-01-01 BC 284-- 285-- test infinity 286-- 287select 'infinity'::date, '-infinity'::date; 288select 'infinity'::date > 'today'::date as t; 289select '-infinity'::date < 'today'::date as t; 290select isfinite('infinity'::date), isfinite('-infinity'::date), isfinite('today'::date); 291-- 292-- oscillating fields from non-finite date/timestamptz: 293-- 294SELECT EXTRACT(HOUR FROM DATE 'infinity'); -- NULL 295SELECT EXTRACT(HOUR FROM DATE '-infinity'); -- NULL 296SELECT EXTRACT(HOUR FROM TIMESTAMP 'infinity'); -- NULL 297SELECT EXTRACT(HOUR FROM TIMESTAMP '-infinity'); -- NULL 298SELECT EXTRACT(HOUR FROM TIMESTAMPTZ 'infinity'); -- NULL 299SELECT EXTRACT(HOUR FROM TIMESTAMPTZ '-infinity'); -- NULL 300-- all possible fields 301SELECT EXTRACT(MICROSECONDS FROM DATE 'infinity'); -- NULL 302SELECT EXTRACT(MILLISECONDS FROM DATE 'infinity'); -- NULL 303SELECT EXTRACT(SECOND FROM DATE 'infinity'); -- NULL 304SELECT EXTRACT(MINUTE FROM DATE 'infinity'); -- NULL 305SELECT EXTRACT(HOUR FROM DATE 'infinity'); -- NULL 306SELECT EXTRACT(DAY FROM DATE 'infinity'); -- NULL 307SELECT EXTRACT(MONTH FROM DATE 'infinity'); -- NULL 308SELECT EXTRACT(QUARTER FROM DATE 'infinity'); -- NULL 309SELECT EXTRACT(WEEK FROM DATE 'infinity'); -- NULL 310SELECT EXTRACT(DOW FROM DATE 'infinity'); -- NULL 311SELECT EXTRACT(ISODOW FROM DATE 'infinity'); -- NULL 312SELECT EXTRACT(DOY FROM DATE 'infinity'); -- NULL 313SELECT EXTRACT(TIMEZONE FROM DATE 'infinity'); -- NULL 314SELECT EXTRACT(TIMEZONE_M FROM DATE 'infinity'); -- NULL 315SELECT EXTRACT(TIMEZONE_H FROM DATE 'infinity'); -- NULL 316-- 317-- monotonic fields from non-finite date/timestamptz: 318-- 319SELECT EXTRACT(EPOCH FROM DATE 'infinity'); -- Infinity 320SELECT EXTRACT(EPOCH FROM DATE '-infinity'); -- -Infinity 321SELECT EXTRACT(EPOCH FROM TIMESTAMP 'infinity'); -- Infinity 322SELECT EXTRACT(EPOCH FROM TIMESTAMP '-infinity'); -- -Infinity 323SELECT EXTRACT(EPOCH FROM TIMESTAMPTZ 'infinity'); -- Infinity 324SELECT EXTRACT(EPOCH FROM TIMESTAMPTZ '-infinity'); -- -Infinity 325-- all possible fields 326SELECT EXTRACT(YEAR FROM DATE 'infinity'); -- Infinity 327SELECT EXTRACT(DECADE FROM DATE 'infinity'); -- Infinity 328SELECT EXTRACT(CENTURY FROM DATE 'infinity'); -- Infinity 329SELECT EXTRACT(MILLENNIUM FROM DATE 'infinity'); -- Infinity 330SELECT EXTRACT(JULIAN FROM DATE 'infinity'); -- Infinity 331SELECT EXTRACT(ISOYEAR FROM DATE 'infinity'); -- Infinity 332SELECT EXTRACT(EPOCH FROM DATE 'infinity'); -- Infinity 333-- 334-- wrong fields from non-finite date: 335-- 336SELECT EXTRACT(MICROSEC FROM DATE 'infinity'); -- ERROR: timestamp units "microsec" not recognized 337 338-- test constructors 339select make_date(2013, 7, 15); 340select make_date(-44, 3, 15); 341select make_time(8, 20, 0.0); 342-- should fail 343select make_date(2013, 2, 30); 344select make_date(2013, 13, 1); 345select make_date(2013, 11, -1); 346select make_time(10, 55, 100.1); 347select make_time(24, 0, 2.1); 348