date.sql 11 KB

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