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