4
CREATE TABLE DATE_TBL (f1 date);
5
INSERT INTO DATE_TBL VALUES ('1957-04-09');
6
INSERT INTO DATE_TBL VALUES ('1957-06-13');
7
INSERT INTO DATE_TBL VALUES ('1996-02-28');
8
INSERT INTO DATE_TBL VALUES ('1996-02-29');
9
INSERT INTO DATE_TBL VALUES ('1996-03-01');
10
INSERT INTO DATE_TBL VALUES ('1996-03-02');
11
INSERT INTO DATE_TBL VALUES ('1997-02-28');
12
INSERT INTO DATE_TBL VALUES ('1997-02-29');
13
ERROR: date/time field value out of range: "1997-02-29"
14
INSERT INTO DATE_TBL VALUES ('1997-03-01');
15
INSERT INTO DATE_TBL VALUES ('1997-03-02');
16
INSERT INTO DATE_TBL VALUES ('2000-04-01');
17
INSERT INTO DATE_TBL VALUES ('2000-04-02');
18
INSERT INTO DATE_TBL VALUES ('2000-04-03');
19
INSERT INTO DATE_TBL VALUES ('2038-04-08');
20
INSERT INTO DATE_TBL VALUES ('2039-04-09');
21
INSERT INTO DATE_TBL VALUES ('2040-04-10');
22
SELECT f1 AS "Fifteen" FROM DATE_TBL;
42
SELECT f1 AS "Nine" FROM DATE_TBL WHERE f1 < '2000-01-01';
56
SELECT f1 AS "Three" FROM DATE_TBL
57
WHERE f1 BETWEEN '2000-01-01' AND '2001-01-01';
66
-- Check all the documented input formats
68
SET datestyle TO iso; -- display results in ISO
70
SELECT date 'January 8, 1999';
76
SELECT date '1999-01-08';
82
SELECT date '1999-01-18';
88
SELECT date '1/8/1999';
89
ERROR: date/time field value out of range: "1/8/1999"
90
HINT: Perhaps you need a different "datestyle" setting.
91
SELECT date '1/18/1999';
92
ERROR: date/time field value out of range: "1/18/1999"
93
HINT: Perhaps you need a different "datestyle" setting.
94
SELECT date '18/1/1999';
95
ERROR: date/time field value out of range: "18/1/1999"
96
HINT: Perhaps you need a different "datestyle" setting.
97
SELECT date '01/02/03';
103
SELECT date '19990108';
109
SELECT date '990108';
115
SELECT date '1999.008';
121
SELECT date 'J2451187';
127
SELECT date 'January 8, 99 BC';
128
ERROR: date/time field value out of range: "January 8, 99 BC"
129
HINT: Perhaps you need a different "datestyle" setting.
130
SELECT date '99-Jan-08';
136
SELECT date '1999-Jan-08';
142
SELECT date '08-Jan-99';
143
ERROR: date/time field value out of range: "08-Jan-99"
144
HINT: Perhaps you need a different "datestyle" setting.
145
SELECT date '08-Jan-1999';
151
SELECT date 'Jan-08-99';
152
ERROR: date/time field value out of range: "Jan-08-99"
153
HINT: Perhaps you need a different "datestyle" setting.
154
SELECT date 'Jan-08-1999';
160
SELECT date '99-08-Jan';
161
ERROR: invalid input syntax for type date: "99-08-Jan"
162
SELECT date '1999-08-Jan';
163
ERROR: invalid input syntax for type date: "1999-08-Jan"
164
SELECT date '99 Jan 08';
170
SELECT date '1999 Jan 08';
176
SELECT date '08 Jan 99';
177
ERROR: date/time field value out of range: "08 Jan 99"
178
HINT: Perhaps you need a different "datestyle" setting.
179
SELECT date '08 Jan 1999';
185
SELECT date 'Jan 08 99';
186
ERROR: date/time field value out of range: "Jan 08 99"
187
HINT: Perhaps you need a different "datestyle" setting.
188
SELECT date 'Jan 08 1999';
194
SELECT date '99 08 Jan';
200
SELECT date '1999 08 Jan';
206
SELECT date '99-01-08';
212
SELECT date '1999-01-08';
218
SELECT date '08-01-99';
219
ERROR: date/time field value out of range: "08-01-99"
220
HINT: Perhaps you need a different "datestyle" setting.
221
SELECT date '08-01-1999';
222
ERROR: date/time field value out of range: "08-01-1999"
223
HINT: Perhaps you need a different "datestyle" setting.
224
SELECT date '01-08-99';
225
ERROR: date/time field value out of range: "01-08-99"
226
HINT: Perhaps you need a different "datestyle" setting.
227
SELECT date '01-08-1999';
228
ERROR: date/time field value out of range: "01-08-1999"
229
HINT: Perhaps you need a different "datestyle" setting.
230
SELECT date '99-08-01';
236
SELECT date '1999-08-01';
242
SELECT date '99 01 08';
248
SELECT date '1999 01 08';
254
SELECT date '08 01 99';
255
ERROR: date/time field value out of range: "08 01 99"
256
HINT: Perhaps you need a different "datestyle" setting.
257
SELECT date '08 01 1999';
258
ERROR: date/time field value out of range: "08 01 1999"
259
HINT: Perhaps you need a different "datestyle" setting.
260
SELECT date '01 08 99';
261
ERROR: date/time field value out of range: "01 08 99"
262
HINT: Perhaps you need a different "datestyle" setting.
263
SELECT date '01 08 1999';
264
ERROR: date/time field value out of range: "01 08 1999"
265
HINT: Perhaps you need a different "datestyle" setting.
266
SELECT date '99 08 01';
272
SELECT date '1999 08 01';
278
SET datestyle TO dmy;
279
SELECT date 'January 8, 1999';
285
SELECT date '1999-01-08';
291
SELECT date '1999-01-18';
297
SELECT date '1/8/1999';
303
SELECT date '1/18/1999';
304
ERROR: date/time field value out of range: "1/18/1999"
305
HINT: Perhaps you need a different "datestyle" setting.
306
SELECT date '18/1/1999';
312
SELECT date '01/02/03';
318
SELECT date '19990108';
324
SELECT date '990108';
330
SELECT date '1999.008';
336
SELECT date 'J2451187';
342
SELECT date 'January 8, 99 BC';
348
SELECT date '99-Jan-08';
349
ERROR: date/time field value out of range: "99-Jan-08"
350
HINT: Perhaps you need a different "datestyle" setting.
351
SELECT date '1999-Jan-08';
357
SELECT date '08-Jan-99';
363
SELECT date '08-Jan-1999';
369
SELECT date 'Jan-08-99';
375
SELECT date 'Jan-08-1999';
381
SELECT date '99-08-Jan';
382
ERROR: invalid input syntax for type date: "99-08-Jan"
383
SELECT date '1999-08-Jan';
384
ERROR: invalid input syntax for type date: "1999-08-Jan"
385
SELECT date '99 Jan 08';
386
ERROR: date/time field value out of range: "99 Jan 08"
387
HINT: Perhaps you need a different "datestyle" setting.
388
SELECT date '1999 Jan 08';
394
SELECT date '08 Jan 99';
400
SELECT date '08 Jan 1999';
406
SELECT date 'Jan 08 99';
412
SELECT date 'Jan 08 1999';
418
SELECT date '99 08 Jan';
419
ERROR: invalid input syntax for type date: "99 08 Jan"
420
SELECT date '1999 08 Jan';
426
SELECT date '99-01-08';
427
ERROR: date/time field value out of range: "99-01-08"
428
HINT: Perhaps you need a different "datestyle" setting.
429
SELECT date '1999-01-08';
435
SELECT date '08-01-99';
441
SELECT date '08-01-1999';
447
SELECT date '01-08-99';
453
SELECT date '01-08-1999';
459
SELECT date '99-08-01';
460
ERROR: date/time field value out of range: "99-08-01"
461
HINT: Perhaps you need a different "datestyle" setting.
462
SELECT date '1999-08-01';
468
SELECT date '99 01 08';
469
ERROR: date/time field value out of range: "99 01 08"
470
HINT: Perhaps you need a different "datestyle" setting.
471
SELECT date '1999 01 08';
477
SELECT date '08 01 99';
483
SELECT date '08 01 1999';
489
SELECT date '01 08 99';
495
SELECT date '01 08 1999';
501
SELECT date '99 08 01';
502
ERROR: date/time field value out of range: "99 08 01"
503
HINT: Perhaps you need a different "datestyle" setting.
504
SELECT date '1999 08 01';
510
SET datestyle TO mdy;
511
SELECT date 'January 8, 1999';
517
SELECT date '1999-01-08';
523
SELECT date '1999-01-18';
529
SELECT date '1/8/1999';
535
SELECT date '1/18/1999';
541
SELECT date '18/1/1999';
542
ERROR: date/time field value out of range: "18/1/1999"
543
HINT: Perhaps you need a different "datestyle" setting.
544
SELECT date '01/02/03';
550
SELECT date '19990108';
556
SELECT date '990108';
562
SELECT date '1999.008';
568
SELECT date 'J2451187';
574
SELECT date 'January 8, 99 BC';
580
SELECT date '99-Jan-08';
581
ERROR: date/time field value out of range: "99-Jan-08"
582
HINT: Perhaps you need a different "datestyle" setting.
583
SELECT date '1999-Jan-08';
589
SELECT date '08-Jan-99';
595
SELECT date '08-Jan-1999';
601
SELECT date 'Jan-08-99';
607
SELECT date 'Jan-08-1999';
613
SELECT date '99-08-Jan';
614
ERROR: invalid input syntax for type date: "99-08-Jan"
615
SELECT date '1999-08-Jan';
616
ERROR: invalid input syntax for type date: "1999-08-Jan"
617
SELECT date '99 Jan 08';
618
ERROR: invalid input syntax for type date: "99 Jan 08"
619
SELECT date '1999 Jan 08';
625
SELECT date '08 Jan 99';
631
SELECT date '08 Jan 1999';
637
SELECT date 'Jan 08 99';
643
SELECT date 'Jan 08 1999';
649
SELECT date '99 08 Jan';
650
ERROR: invalid input syntax for type date: "99 08 Jan"
651
SELECT date '1999 08 Jan';
657
SELECT date '99-01-08';
658
ERROR: date/time field value out of range: "99-01-08"
659
HINT: Perhaps you need a different "datestyle" setting.
660
SELECT date '1999-01-08';
666
SELECT date '08-01-99';
672
SELECT date '08-01-1999';
678
SELECT date '01-08-99';
684
SELECT date '01-08-1999';
690
SELECT date '99-08-01';
691
ERROR: date/time field value out of range: "99-08-01"
692
HINT: Perhaps you need a different "datestyle" setting.
693
SELECT date '1999-08-01';
699
SELECT date '99 01 08';
700
ERROR: date/time field value out of range: "99 01 08"
701
HINT: Perhaps you need a different "datestyle" setting.
702
SELECT date '1999 01 08';
708
SELECT date '08 01 99';
714
SELECT date '08 01 1999';
720
SELECT date '01 08 99';
726
SELECT date '01 08 1999';
732
SELECT date '99 08 01';
733
ERROR: date/time field value out of range: "99 08 01"
734
HINT: Perhaps you need a different "datestyle" setting.
735
SELECT date '1999 08 01';
744
-- Leave most of it for the horology tests
746
SELECT f1 - date '2000-01-01' AS "Days From 2K" FROM DATE_TBL;
766
SELECT f1 - date 'epoch' AS "Days From Epoch" FROM DATE_TBL;
786
SELECT date 'yesterday' - date 'today' AS "One day";
792
SELECT date 'today' - date 'tomorrow' AS "One day";
798
SELECT date 'yesterday' - date 'tomorrow' AS "Two days";
804
SELECT date 'tomorrow' - date 'today' AS "One day";
810
SELECT date 'today' - date 'yesterday' AS "One day";
816
SELECT date 'tomorrow' - date 'yesterday' AS "Two days";
827
SELECT EXTRACT(CENTURY FROM DATE '0101-12-31 BC'); -- -2
833
SELECT EXTRACT(CENTURY FROM DATE '0100-12-31 BC'); -- -1
839
SELECT EXTRACT(CENTURY FROM DATE '0001-12-31 BC'); -- -1
845
SELECT EXTRACT(CENTURY FROM DATE '0001-01-01'); -- 1
851
SELECT EXTRACT(CENTURY FROM DATE '0001-01-01 AD'); -- 1
857
SELECT EXTRACT(CENTURY FROM DATE '1900-12-31'); -- 19
863
SELECT EXTRACT(CENTURY FROM DATE '1901-01-01'); -- 20
869
SELECT EXTRACT(CENTURY FROM DATE '2000-12-31'); -- 20
875
SELECT EXTRACT(CENTURY FROM DATE '2001-01-01'); -- 21
881
SELECT EXTRACT(CENTURY FROM CURRENT_DATE)>=21 AS True; -- true
890
SELECT EXTRACT(MILLENNIUM FROM DATE '0001-12-31 BC'); -- -1
896
SELECT EXTRACT(MILLENNIUM FROM DATE '0001-01-01 AD'); -- 1
902
SELECT EXTRACT(MILLENNIUM FROM DATE '1000-12-31'); -- 1
908
SELECT EXTRACT(MILLENNIUM FROM DATE '1001-01-01'); -- 2
914
SELECT EXTRACT(MILLENNIUM FROM DATE '2000-12-31'); -- 2
920
SELECT EXTRACT(MILLENNIUM FROM DATE '2001-01-01'); -- 3
926
-- next test to be fixed on the turn of the next millennium;-)
927
SELECT EXTRACT(MILLENNIUM FROM CURRENT_DATE); -- 3
936
SELECT EXTRACT(DECADE FROM DATE '1994-12-25'); -- 199
942
SELECT EXTRACT(DECADE FROM DATE '0010-01-01'); -- 1
948
SELECT EXTRACT(DECADE FROM DATE '0009-12-31'); -- 0
954
SELECT EXTRACT(DECADE FROM DATE '0001-01-01 BC'); -- 0
960
SELECT EXTRACT(DECADE FROM DATE '0002-12-31 BC'); -- -1
966
SELECT EXTRACT(DECADE FROM DATE '0011-01-01 BC'); -- -1
972
SELECT EXTRACT(DECADE FROM DATE '0012-12-31 BC'); -- -2
982
SELECT EXTRACT(CENTURY FROM NOW())>=21 AS True; -- true
988
SELECT EXTRACT(CENTURY FROM TIMESTAMP '1970-03-20 04:30:00.00000'); -- 20
995
SELECT EXTRACT(CENTURY FROM INTERVAL '100 y'); -- 1
1001
SELECT EXTRACT(CENTURY FROM INTERVAL '99 y'); -- 0
1007
SELECT EXTRACT(CENTURY FROM INTERVAL '-99 y'); -- 0
1013
SELECT EXTRACT(CENTURY FROM INTERVAL '-100 y'); -- -1
1020
-- test trunc function!
1022
SELECT DATE_TRUNC('MILLENNIUM', TIMESTAMP '1970-03-20 04:30:00.00000'); -- 1001
1024
--------------------------
1025
Thu Jan 01 00:00:00 1001
1028
SELECT DATE_TRUNC('MILLENNIUM', DATE '1970-03-20'); -- 1001-01-01
1030
------------------------------
1031
Thu Jan 01 00:00:00 1001 PST
1034
SELECT DATE_TRUNC('CENTURY', TIMESTAMP '1970-03-20 04:30:00.00000'); -- 1901
1036
--------------------------
1037
Tue Jan 01 00:00:00 1901
1040
SELECT DATE_TRUNC('CENTURY', DATE '1970-03-20'); -- 1901
1042
------------------------------
1043
Tue Jan 01 00:00:00 1901 PST
1046
SELECT DATE_TRUNC('CENTURY', DATE '2004-08-10'); -- 2001-01-01
1048
------------------------------
1049
Mon Jan 01 00:00:00 2001 PST
1052
SELECT DATE_TRUNC('CENTURY', DATE '0002-02-04'); -- 0001-01-01
1054
------------------------------
1055
Mon Jan 01 00:00:00 0001 PST
1058
SELECT DATE_TRUNC('CENTURY', DATE '0055-08-10 BC'); -- 0100-01-01 BC
1060
---------------------------------
1061
Tue Jan 01 00:00:00 0100 PST BC
1064
SELECT DATE_TRUNC('DECADE', DATE '1993-12-25'); -- 1990-01-01
1066
------------------------------
1067
Mon Jan 01 00:00:00 1990 PST
1070
SELECT DATE_TRUNC('DECADE', DATE '0004-12-25'); -- 0001-01-01 BC
1072
---------------------------------
1073
Sat Jan 01 00:00:00 0001 PST BC
1076
SELECT DATE_TRUNC('DECADE', DATE '0002-12-31 BC'); -- 0011-01-01 BC
1078
---------------------------------
1079
Mon Jan 01 00:00:00 0011 PST BC