horology.sql 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570
  1. --
  2. -- HOROLOGY
  3. --
  4. SET DateStyle = 'Postgres, MDY';
  5. SHOW TimeZone; -- Many of these tests depend on the prevailing setting
  6. --
  7. -- Test various input formats
  8. --
  9. SELECT timestamp with time zone '20011227 040506+08';
  10. SELECT timestamp with time zone '20011227 040506-08';
  11. SELECT timestamp with time zone '20011227 040506.789+08';
  12. SELECT timestamp with time zone '20011227 040506.789-08';
  13. SELECT timestamp with time zone '20011227T040506+08';
  14. SELECT timestamp with time zone '20011227T040506-08';
  15. SELECT timestamp with time zone '20011227T040506.789+08';
  16. SELECT timestamp with time zone '20011227T040506.789-08';
  17. SELECT timestamp with time zone '2001-12-27 04:05:06.789-08';
  18. SELECT timestamp with time zone '2001.12.27 04:05:06.789-08';
  19. SELECT timestamp with time zone '2001/12/27 04:05:06.789-08';
  20. SELECT timestamp with time zone '12/27/2001 04:05:06.789-08';
  21. -- should fail in mdy mode:
  22. SELECT timestamp with time zone '27/12/2001 04:05:06.789-08';
  23. set datestyle to dmy;
  24. SELECT timestamp with time zone '27/12/2001 04:05:06.789-08';
  25. reset datestyle;
  26. SELECT timestamp with time zone 'Y2001M12D27H04M05S06.789+08';
  27. SELECT timestamp with time zone 'Y2001M12D27H04M05S06.789-08';
  28. SELECT timestamp with time zone 'Y2001M12D27H04MM05S06.789+08';
  29. SELECT timestamp with time zone 'Y2001M12D27H04MM05S06.789-08';
  30. SELECT timestamp with time zone 'J2452271+08';
  31. SELECT timestamp with time zone 'J2452271-08';
  32. SELECT timestamp with time zone 'J2452271.5+08';
  33. SELECT timestamp with time zone 'J2452271.5-08';
  34. SELECT timestamp with time zone 'J2452271 04:05:06+08';
  35. SELECT timestamp with time zone 'J2452271 04:05:06-08';
  36. SELECT timestamp with time zone 'J2452271T040506+08';
  37. SELECT timestamp with time zone 'J2452271T040506-08';
  38. SELECT timestamp with time zone 'J2452271T040506.789+08';
  39. SELECT timestamp with time zone 'J2452271T040506.789-08';
  40. -- German/European-style dates with periods as delimiters
  41. SELECT timestamp with time zone '12.27.2001 04:05:06.789+08';
  42. SELECT timestamp with time zone '12.27.2001 04:05:06.789-08';
  43. SET DateStyle = 'German';
  44. SELECT timestamp with time zone '27.12.2001 04:05:06.789+08';
  45. SELECT timestamp with time zone '27.12.2001 04:05:06.789-08';
  46. SET DateStyle = 'ISO';
  47. -- As of 7.4, allow time without time zone having a time zone specified
  48. SELECT time without time zone '040506.789+08';
  49. SELECT time without time zone '040506.789-08';
  50. SELECT time without time zone 'T040506.789+08';
  51. SELECT time without time zone 'T040506.789-08';
  52. SELECT time with time zone '040506.789+08';
  53. SELECT time with time zone '040506.789-08';
  54. SELECT time with time zone 'T040506.789+08';
  55. SELECT time with time zone 'T040506.789-08';
  56. SELECT time with time zone 'T040506.789 +08';
  57. SELECT time with time zone 'T040506.789 -08';
  58. SET DateStyle = 'Postgres, MDY';
  59. -- Check Julian dates BC
  60. SELECT date 'J1520447' AS "Confucius' Birthday";
  61. SELECT date 'J0' AS "Julian Epoch";
  62. --
  63. -- date, time arithmetic
  64. --
  65. SELECT date '1981-02-03' + time '04:05:06' AS "Date + Time";
  66. SELECT date '1991-02-03' + time with time zone '04:05:06 PST' AS "Date + Time PST";
  67. SELECT date '2001-02-03' + time with time zone '04:05:06 UTC' AS "Date + Time UTC";
  68. SELECT date '1991-02-03' + interval '2 years' AS "Add Two Years";
  69. SELECT date '2001-12-13' - interval '2 years' AS "Subtract Two Years";
  70. -- subtract time from date should not make sense; use interval instead
  71. SELECT date '1991-02-03' - time '04:05:06' AS "Subtract Time";
  72. SELECT date '1991-02-03' - time with time zone '04:05:06 UTC' AS "Subtract Time UTC";
  73. --
  74. -- timestamp, interval arithmetic
  75. --
  76. SELECT timestamp without time zone '1996-03-01' - interval '1 second' AS "Feb 29";
  77. SELECT timestamp without time zone '1999-03-01' - interval '1 second' AS "Feb 28";
  78. SELECT timestamp without time zone '2000-03-01' - interval '1 second' AS "Feb 29";
  79. SELECT timestamp without time zone '1999-12-01' + interval '1 month - 1 second' AS "Dec 31";
  80. SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '106000000 days' AS "Feb 23, 285506";
  81. SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '107000000 days' AS "Jan 20, 288244";
  82. SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '109203489 days' AS "Dec 31, 294276";
  83. SELECT timestamp without time zone '12/31/294276' - timestamp without time zone '12/23/1999' AS "106751991 Days";
  84. -- Shorthand values
  85. -- Not directly usable for regression testing since these are not constants.
  86. -- So, just try to test parser and hope for the best - thomas 97/04/26
  87. SELECT (timestamp without time zone 'today' = (timestamp without time zone 'yesterday' + interval '1 day')) as "True";
  88. SELECT (timestamp without time zone 'today' = (timestamp without time zone 'tomorrow' - interval '1 day')) as "True";
  89. SELECT (timestamp without time zone 'today 10:30' = (timestamp without time zone 'yesterday' + interval '1 day 10 hr 30 min')) as "True";
  90. SELECT (timestamp without time zone '10:30 today' = (timestamp without time zone 'yesterday' + interval '1 day 10 hr 30 min')) as "True";
  91. SELECT (timestamp without time zone 'tomorrow' = (timestamp without time zone 'yesterday' + interval '2 days')) as "True";
  92. SELECT (timestamp without time zone 'tomorrow 16:00:00' = (timestamp without time zone 'today' + interval '1 day 16 hours')) as "True";
  93. SELECT (timestamp without time zone '16:00:00 tomorrow' = (timestamp without time zone 'today' + interval '1 day 16 hours')) as "True";
  94. SELECT (timestamp without time zone 'yesterday 12:34:56' = (timestamp without time zone 'tomorrow' - interval '2 days - 12:34:56')) as "True";
  95. SELECT (timestamp without time zone '12:34:56 yesterday' = (timestamp without time zone 'tomorrow' - interval '2 days - 12:34:56')) as "True";
  96. SELECT (timestamp without time zone 'tomorrow' > 'now') as "True";
  97. -- Convert from date and time to timestamp
  98. -- This test used to be timestamp(date,time) but no longer allowed by grammar
  99. -- to enable support for SQL99 timestamp type syntax.
  100. SELECT date '1994-01-01' + time '11:00' AS "Jan_01_1994_11am";
  101. SELECT date '1994-01-01' + time '10:00' AS "Jan_01_1994_10am";
  102. SELECT date '1994-01-01' + timetz '11:00-5' AS "Jan_01_1994_8am";
  103. SELECT timestamptz(date '1994-01-01', time with time zone '11:00-5') AS "Jan_01_1994_8am";
  104. SELECT d1 + interval '1 year' AS one_year FROM TIMESTAMP_TBL;
  105. SELECT d1 - interval '1 year' AS one_year FROM TIMESTAMP_TBL;
  106. SELECT timestamp with time zone '1996-03-01' - interval '1 second' AS "Feb 29";
  107. SELECT timestamp with time zone '1999-03-01' - interval '1 second' AS "Feb 28";
  108. SELECT timestamp with time zone '2000-03-01' - interval '1 second' AS "Feb 29";
  109. SELECT timestamp with time zone '1999-12-01' + interval '1 month - 1 second' AS "Dec 31";
  110. SELECT (timestamp with time zone 'today' = (timestamp with time zone 'yesterday' + interval '1 day')) as "True";
  111. SELECT (timestamp with time zone 'today' = (timestamp with time zone 'tomorrow' - interval '1 day')) as "True";
  112. SELECT (timestamp with time zone 'tomorrow' = (timestamp with time zone 'yesterday' + interval '2 days')) as "True";
  113. SELECT (timestamp with time zone 'tomorrow' > 'now') as "True";
  114. -- timestamp with time zone, interval arithmetic around DST change
  115. -- (just for fun, let's use an intentionally nonstandard POSIX zone spec)
  116. SET TIME ZONE 'CST7CDT,M4.1.0,M10.5.0';
  117. SELECT timestamp with time zone '2005-04-02 12:00-07' + interval '1 day' as "Apr 3, 12:00";
  118. SELECT timestamp with time zone '2005-04-02 12:00-07' + interval '24 hours' as "Apr 3, 13:00";
  119. SELECT timestamp with time zone '2005-04-03 12:00-06' - interval '1 day' as "Apr 2, 12:00";
  120. SELECT timestamp with time zone '2005-04-03 12:00-06' - interval '24 hours' as "Apr 2, 11:00";
  121. RESET TIME ZONE;
  122. SELECT timestamptz(date '1994-01-01', time '11:00') AS "Jan_01_1994_10am";
  123. SELECT timestamptz(date '1994-01-01', time '10:00') AS "Jan_01_1994_9am";
  124. SELECT timestamptz(date '1994-01-01', time with time zone '11:00-8') AS "Jan_01_1994_11am";
  125. SELECT timestamptz(date '1994-01-01', time with time zone '10:00-8') AS "Jan_01_1994_10am";
  126. SELECT timestamptz(date '1994-01-01', time with time zone '11:00-5') AS "Jan_01_1994_8am";
  127. SELECT d1 + interval '1 year' AS one_year FROM TIMESTAMPTZ_TBL;
  128. SELECT d1 - interval '1 year' AS one_year FROM TIMESTAMPTZ_TBL;
  129. --
  130. -- time, interval arithmetic
  131. --
  132. SELECT CAST(time '01:02' AS interval) AS "+01:02";
  133. SELECT CAST(interval '02:03' AS time) AS "02:03:00";
  134. SELECT time '01:30' + interval '02:01' AS "03:31:00";
  135. SELECT time '01:30' - interval '02:01' AS "23:29:00";
  136. SELECT time '02:30' + interval '36:01' AS "14:31:00";
  137. SELECT time '03:30' + interval '1 month 04:01' AS "07:31:00";
  138. SELECT CAST(time with time zone '01:02-08' AS interval) AS "+00:01";
  139. SELECT CAST(interval '02:03' AS time with time zone) AS "02:03:00-08";
  140. SELECT time with time zone '01:30-08' - interval '02:01' AS "23:29:00-08";
  141. SELECT time with time zone '02:30-08' + interval '36:01' AS "14:31:00-08";
  142. -- These two tests cannot be used because they default to current timezone,
  143. -- which may be either -08 or -07 depending on the time of year.
  144. -- SELECT time with time zone '01:30' + interval '02:01' AS "03:31:00-08";
  145. -- SELECT time with time zone '03:30' + interval '1 month 04:01' AS "07:31:00-08";
  146. -- Try the following two tests instead, as a poor substitute
  147. SELECT CAST(CAST(date 'today' + time with time zone '05:30'
  148. + interval '02:01' AS time with time zone) AS time) AS "07:31:00";
  149. SELECT CAST(cast(date 'today' + time with time zone '03:30'
  150. + interval '1 month 04:01' as timestamp without time zone) AS time) AS "07:31:00";
  151. SELECT t.d1 AS t, i.f1 AS i, t.d1 + i.f1 AS "add", t.d1 - i.f1 AS "subtract"
  152. FROM TIMESTAMP_TBL t, INTERVAL_TBL i
  153. WHERE t.d1 BETWEEN '1990-01-01' AND '2001-01-01'
  154. AND i.f1 BETWEEN '00:00' AND '23:00'
  155. ORDER BY 1,2;
  156. SELECT t.f1 AS t, i.f1 AS i, t.f1 + i.f1 AS "add", t.f1 - i.f1 AS "subtract"
  157. FROM TIME_TBL t, INTERVAL_TBL i
  158. ORDER BY 1,2;
  159. SELECT t.f1 AS t, i.f1 AS i, t.f1 + i.f1 AS "add", t.f1 - i.f1 AS "subtract"
  160. FROM TIMETZ_TBL t, INTERVAL_TBL i
  161. ORDER BY 1,2;
  162. -- SQL9x OVERLAPS operator
  163. -- test with time zone
  164. SELECT (timestamp with time zone '2000-11-27', timestamp with time zone '2000-11-28')
  165. OVERLAPS (timestamp with time zone '2000-11-27 12:00', timestamp with time zone '2000-11-30') AS "True";
  166. SELECT (timestamp with time zone '2000-11-26', timestamp with time zone '2000-11-27')
  167. OVERLAPS (timestamp with time zone '2000-11-27 12:00', timestamp with time zone '2000-11-30') AS "False";
  168. SELECT (timestamp with time zone '2000-11-27', timestamp with time zone '2000-11-28')
  169. OVERLAPS (timestamp with time zone '2000-11-27 12:00', interval '1 day') AS "True";
  170. SELECT (timestamp with time zone '2000-11-27', interval '12 hours')
  171. OVERLAPS (timestamp with time zone '2000-11-27 12:00', timestamp with time zone '2000-11-30') AS "False";
  172. SELECT (timestamp with time zone '2000-11-27', interval '12 hours')
  173. OVERLAPS (timestamp with time zone '2000-11-27', interval '12 hours') AS "True";
  174. SELECT (timestamp with time zone '2000-11-27', interval '12 hours')
  175. OVERLAPS (timestamp with time zone '2000-11-27 12:00', interval '12 hours') AS "False";
  176. -- test without time zone
  177. SELECT (timestamp without time zone '2000-11-27', timestamp without time zone '2000-11-28')
  178. OVERLAPS (timestamp without time zone '2000-11-27 12:00', timestamp without time zone '2000-11-30') AS "True";
  179. SELECT (timestamp without time zone '2000-11-26', timestamp without time zone '2000-11-27')
  180. OVERLAPS (timestamp without time zone '2000-11-27 12:00', timestamp without time zone '2000-11-30') AS "False";
  181. SELECT (timestamp without time zone '2000-11-27', timestamp without time zone '2000-11-28')
  182. OVERLAPS (timestamp without time zone '2000-11-27 12:00', interval '1 day') AS "True";
  183. SELECT (timestamp without time zone '2000-11-27', interval '12 hours')
  184. OVERLAPS (timestamp without time zone '2000-11-27 12:00', timestamp without time zone '2000-11-30') AS "False";
  185. SELECT (timestamp without time zone '2000-11-27', interval '12 hours')
  186. OVERLAPS (timestamp without time zone '2000-11-27', interval '12 hours') AS "True";
  187. SELECT (timestamp without time zone '2000-11-27', interval '12 hours')
  188. OVERLAPS (timestamp without time zone '2000-11-27 12:00', interval '12 hours') AS "False";
  189. -- test time and interval
  190. SELECT (time '00:00', time '01:00')
  191. OVERLAPS (time '00:30', time '01:30') AS "True";
  192. SELECT (time '00:00', interval '1 hour')
  193. OVERLAPS (time '00:30', interval '1 hour') AS "True";
  194. SELECT (time '00:00', interval '1 hour')
  195. OVERLAPS (time '01:30', interval '1 hour') AS "False";
  196. -- SQL99 seems to want this to be false (and we conform to the spec).
  197. -- istm that this *should* return true, on the theory that time
  198. -- intervals can wrap around the day boundary - thomas 2001-09-25
  199. SELECT (time '00:00', interval '1 hour')
  200. OVERLAPS (time '01:30', interval '1 day') AS "False";
  201. CREATE TABLE TEMP_TIMESTAMP (f1 timestamp with time zone);
  202. -- get some candidate input values
  203. INSERT INTO TEMP_TIMESTAMP (f1)
  204. SELECT d1 FROM TIMESTAMP_TBL
  205. WHERE d1 BETWEEN '13-jun-1957' AND '1-jan-1997'
  206. OR d1 BETWEEN '1-jan-1999' AND '1-jan-2010';
  207. SELECT f1 AS "timestamp"
  208. FROM TEMP_TIMESTAMP
  209. ORDER BY "timestamp";
  210. SELECT d.f1 AS "timestamp", t.f1 AS "interval", d.f1 + t.f1 AS plus
  211. FROM TEMP_TIMESTAMP d, INTERVAL_TBL t
  212. ORDER BY plus, "timestamp", "interval";
  213. SELECT d.f1 AS "timestamp", t.f1 AS "interval", d.f1 - t.f1 AS minus
  214. FROM TEMP_TIMESTAMP d, INTERVAL_TBL t
  215. WHERE isfinite(d.f1)
  216. ORDER BY minus, "timestamp", "interval";
  217. SELECT d.f1 AS "timestamp",
  218. timestamp with time zone '1980-01-06 00:00 GMT' AS gpstime_zero,
  219. d.f1 - timestamp with time zone '1980-01-06 00:00 GMT' AS difference
  220. FROM TEMP_TIMESTAMP d
  221. ORDER BY difference;
  222. SELECT d1.f1 AS timestamp1, d2.f1 AS timestamp2, d1.f1 - d2.f1 AS difference
  223. FROM TEMP_TIMESTAMP d1, TEMP_TIMESTAMP d2
  224. ORDER BY timestamp1, timestamp2, difference;
  225. --
  226. -- Conversions
  227. --
  228. SELECT f1 AS "timestamp", date(f1) AS date
  229. FROM TEMP_TIMESTAMP
  230. WHERE f1 <> timestamp 'now'
  231. ORDER BY date, "timestamp";
  232. DROP TABLE TEMP_TIMESTAMP;
  233. --
  234. -- Comparisons between datetime types, especially overflow cases
  235. ---
  236. SELECT '2202020-10-05'::date::timestamp; -- fail
  237. SELECT '2202020-10-05'::date > '2020-10-05'::timestamp as t;
  238. SELECT '2020-10-05'::timestamp > '2202020-10-05'::date as f;
  239. SELECT '2202020-10-05'::date::timestamptz; -- fail
  240. SELECT '2202020-10-05'::date > '2020-10-05'::timestamptz as t;
  241. SELECT '2020-10-05'::timestamptz > '2202020-10-05'::date as f;
  242. -- This conversion may work depending on timezone
  243. SELECT '4714-11-24 BC'::date::timestamptz;
  244. SET TimeZone = 'UTC-2';
  245. SELECT '4714-11-24 BC'::date::timestamptz; -- fail
  246. SELECT '4714-11-24 BC'::date < '2020-10-05'::timestamptz as t;
  247. SELECT '2020-10-05'::timestamptz >= '4714-11-24 BC'::date as t;
  248. SELECT '4714-11-24 BC'::timestamp < '2020-10-05'::timestamptz as t;
  249. SELECT '2020-10-05'::timestamptz >= '4714-11-24 BC'::timestamp as t;
  250. RESET TimeZone;
  251. --
  252. -- Formats
  253. --
  254. SET DateStyle TO 'US,Postgres';
  255. SHOW DateStyle;
  256. SELECT d1 AS us_postgres FROM TIMESTAMP_TBL;
  257. SET DateStyle TO 'US,ISO';
  258. SELECT d1 AS us_iso FROM TIMESTAMP_TBL;
  259. SET DateStyle TO 'US,SQL';
  260. SHOW DateStyle;
  261. SELECT d1 AS us_sql FROM TIMESTAMP_TBL;
  262. SET DateStyle TO 'European,Postgres';
  263. SHOW DateStyle;
  264. INSERT INTO TIMESTAMP_TBL VALUES('13/06/1957');
  265. SELECT count(*) as one FROM TIMESTAMP_TBL WHERE d1 = 'Jun 13 1957';
  266. SELECT d1 AS european_postgres FROM TIMESTAMP_TBL;
  267. SET DateStyle TO 'European,ISO';
  268. SHOW DateStyle;
  269. SELECT d1 AS european_iso FROM TIMESTAMP_TBL;
  270. SET DateStyle TO 'European,SQL';
  271. SHOW DateStyle;
  272. SELECT d1 AS european_sql FROM TIMESTAMP_TBL;
  273. RESET DateStyle;
  274. --
  275. -- to_timestamp()
  276. --
  277. SELECT to_timestamp('0097/Feb/16 --> 08:14:30', 'YYYY/Mon/DD --> HH:MI:SS');
  278. SELECT to_timestamp('97/2/16 8:14:30', 'FMYYYY/FMMM/FMDD FMHH:FMMI:FMSS');
  279. SELECT to_timestamp('2011$03!18 23_38_15', 'YYYY-MM-DD HH24:MI:SS');
  280. SELECT to_timestamp('1985 January 12', 'YYYY FMMonth DD');
  281. SELECT to_timestamp('1985 FMMonth 12', 'YYYY "FMMonth" DD');
  282. SELECT to_timestamp('1985 \ 12', 'YYYY \\ DD');
  283. SELECT to_timestamp('My birthday-> Year: 1976, Month: May, Day: 16',
  284. '"My birthday-> Year:" YYYY, "Month:" FMMonth, "Day:" DD');
  285. SELECT to_timestamp('1,582nd VIII 21', 'Y,YYYth FMRM DD');
  286. SELECT to_timestamp('15 "text between quote marks" 98 54 45',
  287. E'HH24 "\\"text between quote marks\\"" YY MI SS');
  288. SELECT to_timestamp('05121445482000', 'MMDDHH24MISSYYYY');
  289. SELECT to_timestamp('2000January09Sunday', 'YYYYFMMonthDDFMDay');
  290. SELECT to_timestamp('97/Feb/16', 'YYMonDD');
  291. SELECT to_timestamp('97/Feb/16', 'YY:Mon:DD');
  292. SELECT to_timestamp('97/Feb/16', 'FXYY:Mon:DD');
  293. SELECT to_timestamp('97/Feb/16', 'FXYY/Mon/DD');
  294. SELECT to_timestamp('19971116', 'YYYYMMDD');
  295. SELECT to_timestamp('20000-1116', 'YYYY-MMDD');
  296. SELECT to_timestamp('1997 AD 11 16', 'YYYY BC MM DD');
  297. SELECT to_timestamp('1997 BC 11 16', 'YYYY BC MM DD');
  298. SELECT to_timestamp('1997 A.D. 11 16', 'YYYY B.C. MM DD');
  299. SELECT to_timestamp('1997 B.C. 11 16', 'YYYY B.C. MM DD');
  300. SELECT to_timestamp('9-1116', 'Y-MMDD');
  301. SELECT to_timestamp('95-1116', 'YY-MMDD');
  302. SELECT to_timestamp('995-1116', 'YYY-MMDD');
  303. SELECT to_timestamp('2005426', 'YYYYWWD');
  304. SELECT to_timestamp('2005300', 'YYYYDDD');
  305. SELECT to_timestamp('2005527', 'IYYYIWID');
  306. SELECT to_timestamp('005527', 'IYYIWID');
  307. SELECT to_timestamp('05527', 'IYIWID');
  308. SELECT to_timestamp('5527', 'IIWID');
  309. SELECT to_timestamp('2005364', 'IYYYIDDD');
  310. SELECT to_timestamp('20050302', 'YYYYMMDD');
  311. SELECT to_timestamp('2005 03 02', 'YYYYMMDD');
  312. SELECT to_timestamp(' 2005 03 02', 'YYYYMMDD');
  313. SELECT to_timestamp(' 20050302', 'YYYYMMDD');
  314. SELECT to_timestamp('2011-12-18 11:38 AM', 'YYYY-MM-DD HH12:MI PM');
  315. SELECT to_timestamp('2011-12-18 11:38 PM', 'YYYY-MM-DD HH12:MI PM');
  316. SELECT to_timestamp('2011-12-18 11:38 A.M.', 'YYYY-MM-DD HH12:MI P.M.');
  317. SELECT to_timestamp('2011-12-18 11:38 P.M.', 'YYYY-MM-DD HH12:MI P.M.');
  318. SELECT to_timestamp('2011-12-18 11:38 +05', 'YYYY-MM-DD HH12:MI TZH');
  319. SELECT to_timestamp('2011-12-18 11:38 -05', 'YYYY-MM-DD HH12:MI TZH');
  320. SELECT to_timestamp('2011-12-18 11:38 +05:20', 'YYYY-MM-DD HH12:MI TZH:TZM');
  321. SELECT to_timestamp('2011-12-18 11:38 -05:20', 'YYYY-MM-DD HH12:MI TZH:TZM');
  322. SELECT to_timestamp('2011-12-18 11:38 20', 'YYYY-MM-DD HH12:MI TZM');
  323. SELECT to_timestamp('2011-12-18 11:38 PST', 'YYYY-MM-DD HH12:MI TZ'); -- NYI
  324. SELECT to_timestamp('2018-11-02 12:34:56.025', 'YYYY-MM-DD HH24:MI:SS.MS');
  325. SELECT i, to_timestamp('2018-11-02 12:34:56', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i;
  326. SELECT i, to_timestamp('2018-11-02 12:34:56.1', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i;
  327. SELECT i, to_timestamp('2018-11-02 12:34:56.12', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i;
  328. SELECT i, to_timestamp('2018-11-02 12:34:56.123', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i;
  329. SELECT i, to_timestamp('2018-11-02 12:34:56.1234', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i;
  330. SELECT i, to_timestamp('2018-11-02 12:34:56.12345', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i;
  331. SELECT i, to_timestamp('2018-11-02 12:34:56.123456', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i;
  332. SELECT i, to_timestamp('2018-11-02 12:34:56.123456789', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i;
  333. SELECT to_date('1 4 1902', 'Q MM YYYY'); -- Q is ignored
  334. SELECT to_date('3 4 21 01', 'W MM CC YY');
  335. SELECT to_date('2458872', 'J');
  336. --
  337. -- Check handling of BC dates
  338. --
  339. SELECT to_date('44-02-01 BC','YYYY-MM-DD BC');
  340. SELECT to_date('-44-02-01','YYYY-MM-DD');
  341. SELECT to_date('-44-02-01 BC','YYYY-MM-DD BC');
  342. SELECT to_timestamp('44-02-01 11:12:13 BC','YYYY-MM-DD HH24:MI:SS BC');
  343. SELECT to_timestamp('-44-02-01 11:12:13','YYYY-MM-DD HH24:MI:SS');
  344. SELECT to_timestamp('-44-02-01 11:12:13 BC','YYYY-MM-DD HH24:MI:SS BC');
  345. --
  346. -- Check handling of multiple spaces in format and/or input
  347. --
  348. SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS');
  349. SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS');
  350. SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS');
  351. SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS');
  352. SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS');
  353. SELECT to_timestamp('2011-12-18 23:38:15', 'YYYY-MM-DD HH24:MI:SS');
  354. SELECT to_timestamp('2000+ JUN', 'YYYY/MON');
  355. SELECT to_timestamp(' 2000 +JUN', 'YYYY/MON');
  356. SELECT to_timestamp(' 2000 +JUN', 'YYYY//MON');
  357. SELECT to_timestamp('2000 +JUN', 'YYYY//MON');
  358. SELECT to_timestamp('2000 + JUN', 'YYYY MON');
  359. SELECT to_timestamp('2000 ++ JUN', 'YYYY MON');
  360. SELECT to_timestamp('2000 + + JUN', 'YYYY MON');
  361. SELECT to_timestamp('2000 + + JUN', 'YYYY MON');
  362. SELECT to_timestamp('2000 -10', 'YYYY TZH');
  363. SELECT to_timestamp('2000 -10', 'YYYY TZH');
  364. SELECT to_date('2011 12 18', 'YYYY MM DD');
  365. SELECT to_date('2011 12 18', 'YYYY MM DD');
  366. SELECT to_date('2011 12 18', 'YYYY MM DD');
  367. SELECT to_date('2011 12 18', 'YYYY MM DD');
  368. SELECT to_date('2011 12 18', 'YYYY MM DD');
  369. SELECT to_date('2011 12 18', 'YYYY MM DD');
  370. SELECT to_date('2011 12 18', 'YYYYxMMxDD');
  371. SELECT to_date('2011x 12x 18', 'YYYYxMMxDD');
  372. SELECT to_date('2011 x12 x18', 'YYYYxMMxDD');
  373. --
  374. -- Check errors for some incorrect usages of to_timestamp() and to_date()
  375. --
  376. -- Mixture of date conventions (ISO week and Gregorian):
  377. SELECT to_timestamp('2005527', 'YYYYIWID');
  378. -- Insufficient characters in the source string:
  379. SELECT to_timestamp('19971', 'YYYYMMDD');
  380. -- Insufficient digit characters for a single node:
  381. SELECT to_timestamp('19971)24', 'YYYYMMDD');
  382. -- We don't accept full-length day or month names if short form is specified:
  383. SELECT to_timestamp('Friday 1-January-1999', 'DY DD MON YYYY');
  384. SELECT to_timestamp('Fri 1-January-1999', 'DY DD MON YYYY');
  385. SELECT to_timestamp('Fri 1-Jan-1999', 'DY DD MON YYYY'); -- ok
  386. -- Value clobbering:
  387. SELECT to_timestamp('1997-11-Jan-16', 'YYYY-MM-Mon-DD');
  388. -- Non-numeric input:
  389. SELECT to_timestamp('199711xy', 'YYYYMMDD');
  390. -- Input that doesn't fit in an int:
  391. SELECT to_timestamp('10000000000', 'FMYYYY');
  392. -- Out-of-range and not-quite-out-of-range fields:
  393. SELECT to_timestamp('2016-06-13 25:00:00', 'YYYY-MM-DD HH24:MI:SS');
  394. SELECT to_timestamp('2016-06-13 15:60:00', 'YYYY-MM-DD HH24:MI:SS');
  395. SELECT to_timestamp('2016-06-13 15:50:60', 'YYYY-MM-DD HH24:MI:SS');
  396. SELECT to_timestamp('2016-06-13 15:50:55', 'YYYY-MM-DD HH24:MI:SS'); -- ok
  397. SELECT to_timestamp('2016-06-13 15:50:55', 'YYYY-MM-DD HH:MI:SS');
  398. SELECT to_timestamp('2016-13-01 15:50:55', 'YYYY-MM-DD HH24:MI:SS');
  399. SELECT to_timestamp('2016-02-30 15:50:55', 'YYYY-MM-DD HH24:MI:SS');
  400. SELECT to_timestamp('2016-02-29 15:50:55', 'YYYY-MM-DD HH24:MI:SS'); -- ok
  401. SELECT to_timestamp('2015-02-29 15:50:55', 'YYYY-MM-DD HH24:MI:SS');
  402. SELECT to_timestamp('2015-02-11 86000', 'YYYY-MM-DD SSSS'); -- ok
  403. SELECT to_timestamp('2015-02-11 86400', 'YYYY-MM-DD SSSS');
  404. SELECT to_timestamp('2015-02-11 86000', 'YYYY-MM-DD SSSSS'); -- ok
  405. SELECT to_timestamp('2015-02-11 86400', 'YYYY-MM-DD SSSSS');
  406. SELECT to_date('2016-13-10', 'YYYY-MM-DD');
  407. SELECT to_date('2016-02-30', 'YYYY-MM-DD');
  408. SELECT to_date('2016-02-29', 'YYYY-MM-DD'); -- ok
  409. SELECT to_date('2015-02-29', 'YYYY-MM-DD');
  410. SELECT to_date('2015 365', 'YYYY DDD'); -- ok
  411. SELECT to_date('2015 366', 'YYYY DDD');
  412. SELECT to_date('2016 365', 'YYYY DDD'); -- ok
  413. SELECT to_date('2016 366', 'YYYY DDD'); -- ok
  414. SELECT to_date('2016 367', 'YYYY DDD');
  415. SELECT to_date('0000-02-01','YYYY-MM-DD'); -- allowed, though it shouldn't be
  416. --
  417. -- Check behavior with SQL-style fixed-GMT-offset time zone (cf bug #8572)
  418. --
  419. SET TIME ZONE 'America/New_York';
  420. SET TIME ZONE '-1.5';
  421. SHOW TIME ZONE;
  422. SELECT '2012-12-12 12:00'::timestamptz;
  423. SELECT '2012-12-12 12:00 America/New_York'::timestamptz;
  424. SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD HH:MI:SS TZ');
  425. SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD SSSS');
  426. SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD SSSSS');
  427. RESET TIME ZONE;