timestamptz.sql 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567
  1. --
  2. -- TIMESTAMPTZ
  3. --
  4. CREATE TABLE TIMESTAMPTZ_TBL (d1 timestamp(2) with time zone);
  5. -- Test shorthand input values
  6. -- We can't just "select" the results since they aren't constants; test for
  7. -- equality instead. We can do that by running the test inside a transaction
  8. -- block, within which the value of 'now' shouldn't change, and so these
  9. -- related values shouldn't either.
  10. BEGIN;
  11. INSERT INTO TIMESTAMPTZ_TBL VALUES ('today');
  12. INSERT INTO TIMESTAMPTZ_TBL VALUES ('yesterday');
  13. INSERT INTO TIMESTAMPTZ_TBL VALUES ('tomorrow');
  14. INSERT INTO TIMESTAMPTZ_TBL VALUES ('tomorrow EST');
  15. INSERT INTO TIMESTAMPTZ_TBL VALUES ('tomorrow zulu');
  16. SELECT count(*) AS One FROM TIMESTAMPTZ_TBL WHERE d1 = timestamp with time zone 'today';
  17. SELECT count(*) AS One FROM TIMESTAMPTZ_TBL WHERE d1 = timestamp with time zone 'tomorrow';
  18. SELECT count(*) AS One FROM TIMESTAMPTZ_TBL WHERE d1 = timestamp with time zone 'yesterday';
  19. SELECT count(*) AS One FROM TIMESTAMPTZ_TBL WHERE d1 = timestamp with time zone 'tomorrow EST';
  20. SELECT count(*) AS One FROM TIMESTAMPTZ_TBL WHERE d1 = timestamp with time zone 'tomorrow zulu';
  21. COMMIT;
  22. DELETE FROM TIMESTAMPTZ_TBL;
  23. -- Verify that 'now' *does* change over a reasonable interval such as 100 msec,
  24. -- and that it doesn't change over the same interval within a transaction block
  25. INSERT INTO TIMESTAMPTZ_TBL VALUES ('now');
  26. SELECT pg_sleep(0.1);
  27. BEGIN;
  28. INSERT INTO TIMESTAMPTZ_TBL VALUES ('now');
  29. SELECT pg_sleep(0.1);
  30. INSERT INTO TIMESTAMPTZ_TBL VALUES ('now');
  31. SELECT pg_sleep(0.1);
  32. SELECT count(*) AS two FROM TIMESTAMPTZ_TBL WHERE d1 = timestamp(2) with time zone 'now';
  33. SELECT count(d1) AS three, count(DISTINCT d1) AS two FROM TIMESTAMPTZ_TBL;
  34. COMMIT;
  35. TRUNCATE TIMESTAMPTZ_TBL;
  36. -- Special values
  37. INSERT INTO TIMESTAMPTZ_TBL VALUES ('-infinity');
  38. INSERT INTO TIMESTAMPTZ_TBL VALUES ('infinity');
  39. INSERT INTO TIMESTAMPTZ_TBL VALUES ('epoch');
  40. -- Postgres v6.0 standard output format
  41. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mon Feb 10 17:32:01 1997 PST');
  42. -- Variations on Postgres v6.1 standard output format
  43. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mon Feb 10 17:32:01.000001 1997 PST');
  44. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mon Feb 10 17:32:01.999999 1997 PST');
  45. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mon Feb 10 17:32:01.4 1997 PST');
  46. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mon Feb 10 17:32:01.5 1997 PST');
  47. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mon Feb 10 17:32:01.6 1997 PST');
  48. -- ISO 8601 format
  49. INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997-01-02');
  50. INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997-01-02 03:04:05');
  51. INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997-02-10 17:32:01-08');
  52. INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997-02-10 17:32:01-0800');
  53. INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997-02-10 17:32:01 -08:00');
  54. INSERT INTO TIMESTAMPTZ_TBL VALUES ('19970210 173201 -0800');
  55. INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997-06-10 17:32:01 -07:00');
  56. INSERT INTO TIMESTAMPTZ_TBL VALUES ('2001-09-22T18:19:20');
  57. -- POSIX format (note that the timezone abbrev is just decoration here)
  58. INSERT INTO TIMESTAMPTZ_TBL VALUES ('2000-03-15 08:14:01 GMT+8');
  59. INSERT INTO TIMESTAMPTZ_TBL VALUES ('2000-03-15 13:14:02 GMT-1');
  60. INSERT INTO TIMESTAMPTZ_TBL VALUES ('2000-03-15 12:14:03 GMT-2');
  61. INSERT INTO TIMESTAMPTZ_TBL VALUES ('2000-03-15 03:14:04 PST+8');
  62. INSERT INTO TIMESTAMPTZ_TBL VALUES ('2000-03-15 02:14:05 MST+7:00');
  63. -- Variations for acceptable input formats
  64. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 10 17:32:01 1997 -0800');
  65. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 10 17:32:01 1997');
  66. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 10 5:32PM 1997');
  67. INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997/02/10 17:32:01-0800');
  68. INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997-02-10 17:32:01 PST');
  69. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb-10-1997 17:32:01 PST');
  70. INSERT INTO TIMESTAMPTZ_TBL VALUES ('02-10-1997 17:32:01 PST');
  71. INSERT INTO TIMESTAMPTZ_TBL VALUES ('19970210 173201 PST');
  72. set datestyle to ymd;
  73. INSERT INTO TIMESTAMPTZ_TBL VALUES ('97FEB10 5:32:01PM UTC');
  74. INSERT INTO TIMESTAMPTZ_TBL VALUES ('97/02/10 17:32:01 UTC');
  75. reset datestyle;
  76. INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997.041 17:32:01 UTC');
  77. -- timestamps at different timezones
  78. INSERT INTO TIMESTAMPTZ_TBL VALUES ('19970210 173201 America/New_York');
  79. SELECT '19970210 173201' AT TIME ZONE 'America/New_York';
  80. INSERT INTO TIMESTAMPTZ_TBL VALUES ('19970710 173201 America/New_York');
  81. SELECT '19970710 173201' AT TIME ZONE 'America/New_York';
  82. INSERT INTO TIMESTAMPTZ_TBL VALUES ('19970710 173201 America/Does_not_exist');
  83. SELECT '19970710 173201' AT TIME ZONE 'America/Does_not_exist';
  84. -- Daylight saving time for timestamps beyond 32-bit time_t range.
  85. SELECT '20500710 173201 Europe/Helsinki'::timestamptz; -- DST
  86. SELECT '20500110 173201 Europe/Helsinki'::timestamptz; -- non-DST
  87. SELECT '205000-07-10 17:32:01 Europe/Helsinki'::timestamptz; -- DST
  88. SELECT '205000-01-10 17:32:01 Europe/Helsinki'::timestamptz; -- non-DST
  89. -- Check date conversion and date arithmetic
  90. INSERT INTO TIMESTAMPTZ_TBL VALUES ('1997-06-10 18:32:01 PDT');
  91. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 10 17:32:01 1997');
  92. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 11 17:32:01 1997');
  93. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 12 17:32:01 1997');
  94. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 13 17:32:01 1997');
  95. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 14 17:32:01 1997');
  96. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 15 17:32:01 1997');
  97. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 1997');
  98. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 0097 BC');
  99. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 0097');
  100. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 0597');
  101. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 1097');
  102. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 1697');
  103. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 1797');
  104. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 1897');
  105. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 1997');
  106. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 2097');
  107. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 28 17:32:01 1996');
  108. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 29 17:32:01 1996');
  109. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mar 01 17:32:01 1996');
  110. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Dec 30 17:32:01 1996');
  111. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Dec 31 17:32:01 1996');
  112. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Jan 01 17:32:01 1997');
  113. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 28 17:32:01 1997');
  114. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 29 17:32:01 1997');
  115. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Mar 01 17:32:01 1997');
  116. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Dec 30 17:32:01 1997');
  117. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Dec 31 17:32:01 1997');
  118. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Dec 31 17:32:01 1999');
  119. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Jan 01 17:32:01 2000');
  120. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Dec 31 17:32:01 2000');
  121. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Jan 01 17:32:01 2001');
  122. -- Currently unsupported syntax and ranges
  123. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 -0097');
  124. INSERT INTO TIMESTAMPTZ_TBL VALUES ('Feb 16 17:32:01 5097 BC');
  125. -- Alternative field order that we've historically supported (sort of)
  126. -- with regular and POSIXy timezone specs
  127. SELECT 'Wed Jul 11 10:51:14 America/New_York 2001'::timestamptz;
  128. SELECT 'Wed Jul 11 10:51:14 GMT-4 2001'::timestamptz;
  129. SELECT 'Wed Jul 11 10:51:14 GMT+4 2001'::timestamptz;
  130. SELECT 'Wed Jul 11 10:51:14 PST-03:00 2001'::timestamptz;
  131. SELECT 'Wed Jul 11 10:51:14 PST+03:00 2001'::timestamptz;
  132. SELECT d1 FROM TIMESTAMPTZ_TBL;
  133. -- Check behavior at the boundaries of the timestamp range
  134. SELECT '4714-11-24 00:00:00+00 BC'::timestamptz;
  135. SELECT '4714-11-23 16:00:00-08 BC'::timestamptz;
  136. SELECT 'Sun Nov 23 16:00:00 4714 PST BC'::timestamptz;
  137. SELECT '4714-11-23 23:59:59+00 BC'::timestamptz; -- out of range
  138. SELECT '294276-12-31 23:59:59+00'::timestamptz;
  139. SELECT '294276-12-31 15:59:59-08'::timestamptz;
  140. SELECT '294277-01-01 00:00:00+00'::timestamptz; -- out of range
  141. SELECT '294277-12-31 16:00:00-08'::timestamptz; -- out of range
  142. -- Demonstrate functions and operators
  143. SELECT d1 FROM TIMESTAMPTZ_TBL
  144. WHERE d1 > timestamp with time zone '1997-01-02';
  145. SELECT d1 FROM TIMESTAMPTZ_TBL
  146. WHERE d1 < timestamp with time zone '1997-01-02';
  147. SELECT d1 FROM TIMESTAMPTZ_TBL
  148. WHERE d1 = timestamp with time zone '1997-01-02';
  149. SELECT d1 FROM TIMESTAMPTZ_TBL
  150. WHERE d1 != timestamp with time zone '1997-01-02';
  151. SELECT d1 FROM TIMESTAMPTZ_TBL
  152. WHERE d1 <= timestamp with time zone '1997-01-02';
  153. SELECT d1 FROM TIMESTAMPTZ_TBL
  154. WHERE d1 >= timestamp with time zone '1997-01-02';
  155. SELECT d1 - timestamp with time zone '1997-01-02' AS diff
  156. FROM TIMESTAMPTZ_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01';
  157. SELECT date_trunc( 'week', timestamp with time zone '2004-02-29 15:44:17.71393' ) AS week_trunc;
  158. SELECT date_trunc('day', timestamp with time zone '2001-02-16 20:38:40+00', 'Australia/Sydney') as sydney_trunc; -- zone name
  159. SELECT date_trunc('day', timestamp with time zone '2001-02-16 20:38:40+00', 'GMT') as gmt_trunc; -- fixed-offset abbreviation
  160. SELECT date_trunc('day', timestamp with time zone '2001-02-16 20:38:40+00', 'VET') as vet_trunc; -- variable-offset abbreviation
  161. -- verify date_bin behaves the same as date_trunc for relevant intervals
  162. SELECT
  163. str,
  164. interval,
  165. date_trunc(str, ts, 'Australia/Sydney') = date_bin(interval::interval, ts, timestamp with time zone '2001-01-01+11') AS equal
  166. FROM (
  167. VALUES
  168. ('day', '1 d'),
  169. ('hour', '1 h'),
  170. ('minute', '1 m'),
  171. ('second', '1 s'),
  172. ('millisecond', '1 ms'),
  173. ('microsecond', '1 us')
  174. ) intervals (str, interval),
  175. (VALUES (timestamptz '2020-02-29 15:44:17.71393+00')) ts (ts);
  176. -- bin timestamps into arbitrary intervals
  177. SELECT
  178. interval,
  179. ts,
  180. origin,
  181. date_bin(interval::interval, ts, origin)
  182. FROM (
  183. VALUES
  184. ('15 days'),
  185. ('2 hours'),
  186. ('1 hour 30 minutes'),
  187. ('15 minutes'),
  188. ('10 seconds'),
  189. ('100 milliseconds'),
  190. ('250 microseconds')
  191. ) intervals (interval),
  192. (VALUES (timestamptz '2020-02-11 15:44:17.71393')) ts (ts),
  193. (VALUES (timestamptz '2001-01-01')) origin (origin);
  194. -- shift bins using the origin parameter:
  195. SELECT date_bin('5 min'::interval, timestamptz '2020-02-01 01:01:01+00', timestamptz '2020-02-01 00:02:30+00');
  196. -- disallow intervals with months or years
  197. SELECT date_bin('5 months'::interval, timestamp with time zone '2020-02-01 01:01:01+00', timestamp with time zone '2001-01-01+00');
  198. SELECT date_bin('5 years'::interval, timestamp with time zone '2020-02-01 01:01:01+00', timestamp with time zone '2001-01-01+00');
  199. -- disallow zero intervals
  200. SELECT date_bin('0 days'::interval, timestamp with time zone '1970-01-01 01:00:00+00' , timestamp with time zone '1970-01-01 00:00:00+00');
  201. -- disallow negative intervals
  202. SELECT date_bin('-2 days'::interval, timestamp with time zone '1970-01-01 01:00:00+00' , timestamp with time zone '1970-01-01 00:00:00+00');
  203. -- Test casting within a BETWEEN qualifier
  204. SELECT d1 - timestamp with time zone '1997-01-02' AS diff
  205. FROM TIMESTAMPTZ_TBL
  206. WHERE d1 BETWEEN timestamp with time zone '1902-01-01' AND timestamp with time zone '2038-01-01';
  207. -- DATE_PART (timestamptz_part)
  208. SELECT d1 as timestamptz,
  209. date_part( 'year', d1) AS year, date_part( 'month', d1) AS month,
  210. date_part( 'day', d1) AS day, date_part( 'hour', d1) AS hour,
  211. date_part( 'minute', d1) AS minute, date_part( 'second', d1) AS second
  212. FROM TIMESTAMPTZ_TBL;
  213. SELECT d1 as timestamptz,
  214. date_part( 'quarter', d1) AS quarter, date_part( 'msec', d1) AS msec,
  215. date_part( 'usec', d1) AS usec
  216. FROM TIMESTAMPTZ_TBL;
  217. SELECT d1 as timestamptz,
  218. date_part( 'isoyear', d1) AS isoyear, date_part( 'week', d1) AS week,
  219. date_part( 'isodow', d1) AS isodow, date_part( 'dow', d1) AS dow,
  220. date_part( 'doy', d1) AS doy
  221. FROM TIMESTAMPTZ_TBL;
  222. SELECT d1 as timestamptz,
  223. date_part( 'decade', d1) AS decade,
  224. date_part( 'century', d1) AS century,
  225. date_part( 'millennium', d1) AS millennium,
  226. round(date_part( 'julian', d1)) AS julian,
  227. date_part( 'epoch', d1) AS epoch
  228. FROM TIMESTAMPTZ_TBL;
  229. SELECT d1 as timestamptz,
  230. date_part( 'timezone', d1) AS timezone,
  231. date_part( 'timezone_hour', d1) AS timezone_hour,
  232. date_part( 'timezone_minute', d1) AS timezone_minute
  233. FROM TIMESTAMPTZ_TBL;
  234. -- extract implementation is mostly the same as date_part, so only
  235. -- test a few cases for additional coverage.
  236. SELECT d1 as "timestamp",
  237. extract(microseconds from d1) AS microseconds,
  238. extract(milliseconds from d1) AS milliseconds,
  239. extract(seconds from d1) AS seconds,
  240. round(extract(julian from d1)) AS julian,
  241. extract(epoch from d1) AS epoch
  242. FROM TIMESTAMPTZ_TBL;
  243. -- value near upper bound uses special case in code
  244. SELECT date_part('epoch', '294270-01-01 00:00:00+00'::timestamptz);
  245. SELECT extract(epoch from '294270-01-01 00:00:00+00'::timestamptz);
  246. -- another internal overflow test case
  247. SELECT extract(epoch from '5000-01-01 00:00:00+00'::timestamptz);
  248. -- TO_CHAR()
  249. SELECT to_char(d1, 'DAY Day day DY Dy dy MONTH Month month RM MON Mon mon')
  250. FROM TIMESTAMPTZ_TBL;
  251. SELECT to_char(d1, 'FMDAY FMDay FMday FMMONTH FMMonth FMmonth FMRM')
  252. FROM TIMESTAMPTZ_TBL;
  253. SELECT to_char(d1, 'Y,YYY YYYY YYY YY Y CC Q MM WW DDD DD D J')
  254. FROM TIMESTAMPTZ_TBL;
  255. SELECT to_char(d1, 'FMY,YYY FMYYYY FMYYY FMYY FMY FMCC FMQ FMMM FMWW FMDDD FMDD FMD FMJ')
  256. FROM TIMESTAMPTZ_TBL;
  257. SELECT to_char(d1, 'HH HH12 HH24 MI SS SSSS')
  258. FROM TIMESTAMPTZ_TBL;
  259. SELECT to_char(d1, E'"HH:MI:SS is" HH:MI:SS "\\"text between quote marks\\""')
  260. FROM TIMESTAMPTZ_TBL;
  261. SELECT to_char(d1, 'HH24--text--MI--text--SS')
  262. FROM TIMESTAMPTZ_TBL;
  263. SELECT to_char(d1, 'YYYYTH YYYYth Jth')
  264. FROM TIMESTAMPTZ_TBL;
  265. SELECT to_char(d1, 'YYYY A.D. YYYY a.d. YYYY bc HH:MI:SS P.M. HH:MI:SS p.m. HH:MI:SS pm')
  266. FROM TIMESTAMPTZ_TBL;
  267. SELECT to_char(d1, 'IYYY IYY IY I IW IDDD ID')
  268. FROM TIMESTAMPTZ_TBL;
  269. SELECT to_char(d1, 'FMIYYY FMIYY FMIY FMI FMIW FMIDDD FMID')
  270. FROM TIMESTAMPTZ_TBL;
  271. SELECT to_char(d, 'FF1 FF2 FF3 FF4 FF5 FF6 ff1 ff2 ff3 ff4 ff5 ff6 MS US')
  272. FROM (VALUES
  273. ('2018-11-02 12:34:56'::timestamptz),
  274. ('2018-11-02 12:34:56.78'),
  275. ('2018-11-02 12:34:56.78901'),
  276. ('2018-11-02 12:34:56.78901234')
  277. ) d(d);
  278. -- Check OF, TZH, TZM with various zone offsets, particularly fractional hours
  279. SET timezone = '00:00';
  280. SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM";
  281. SET timezone = '+02:00';
  282. SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM";
  283. SET timezone = '-13:00';
  284. SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM";
  285. SET timezone = '-00:30';
  286. SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM";
  287. SET timezone = '00:30';
  288. SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM";
  289. SET timezone = '-04:30';
  290. SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM";
  291. SET timezone = '04:30';
  292. SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM";
  293. SET timezone = '-04:15';
  294. SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM";
  295. SET timezone = '04:15';
  296. SELECT to_char(now(), 'OF') as "OF", to_char(now(), 'TZH:TZM') as "TZH:TZM";
  297. RESET timezone;
  298. CREATE TABLE TIMESTAMPTZ_TST (a int , b timestamptz);
  299. -- Test year field value with len > 4
  300. INSERT INTO TIMESTAMPTZ_TST VALUES(1, 'Sat Mar 12 23:58:48 1000 IST');
  301. INSERT INTO TIMESTAMPTZ_TST VALUES(2, 'Sat Mar 12 23:58:48 10000 IST');
  302. INSERT INTO TIMESTAMPTZ_TST VALUES(3, 'Sat Mar 12 23:58:48 100000 IST');
  303. INSERT INTO TIMESTAMPTZ_TST VALUES(3, '10000 Mar 12 23:58:48 IST');
  304. INSERT INTO TIMESTAMPTZ_TST VALUES(4, '100000312 23:58:48 IST');
  305. INSERT INTO TIMESTAMPTZ_TST VALUES(4, '1000000312 23:58:48 IST');
  306. --Verify data
  307. SELECT * FROM TIMESTAMPTZ_TST ORDER BY a;
  308. --Cleanup
  309. DROP TABLE TIMESTAMPTZ_TST;
  310. -- test timestamptz constructors
  311. set TimeZone to 'America/New_York';
  312. -- numeric timezone
  313. SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33);
  314. SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33, '+2');
  315. SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33, '-2');
  316. WITH tzs (tz) AS (VALUES
  317. ('+1'), ('+1:'), ('+1:0'), ('+100'), ('+1:00'), ('+01:00'),
  318. ('+10'), ('+1000'), ('+10:'), ('+10:0'), ('+10:00'), ('+10:00:'),
  319. ('+10:00:1'), ('+10:00:01'),
  320. ('+10:00:10'))
  321. SELECT make_timestamptz(2010, 2, 27, 3, 45, 00, tz), tz FROM tzs;
  322. -- these should fail
  323. SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33, '2');
  324. SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, '+16');
  325. SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, '-16');
  326. -- should be true
  327. SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33, '+2') = '1973-07-15 08:15:55.33+02'::timestamptz;
  328. -- full timezone names
  329. SELECT make_timestamptz(2014, 12, 10, 0, 0, 0, 'Europe/Prague') = timestamptz '2014-12-10 00:00:00 Europe/Prague';
  330. SELECT make_timestamptz(2014, 12, 10, 0, 0, 0, 'Europe/Prague') AT TIME ZONE 'UTC';
  331. SELECT make_timestamptz(1846, 12, 10, 0, 0, 0, 'Asia/Manila') AT TIME ZONE 'UTC';
  332. SELECT make_timestamptz(1881, 12, 10, 0, 0, 0, 'Europe/Paris') AT TIME ZONE 'UTC';
  333. SELECT make_timestamptz(1910, 12, 24, 0, 0, 0, 'Nehwon/Lankhmar');
  334. -- abbreviations
  335. SELECT make_timestamptz(2008, 12, 10, 10, 10, 10, 'EST');
  336. SELECT make_timestamptz(2008, 12, 10, 10, 10, 10, 'EDT');
  337. SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, 'PST8PDT');
  338. RESET TimeZone;
  339. -- generate_series for timestamptz
  340. select * from generate_series('2020-01-01 00:00'::timestamptz,
  341. '2020-01-02 03:00'::timestamptz,
  342. '1 hour'::interval);
  343. -- the LIMIT should allow this to terminate in a reasonable amount of time
  344. -- (but that unfortunately doesn't work yet for SELECT * FROM ...)
  345. select generate_series('2022-01-01 00:00'::timestamptz,
  346. 'infinity'::timestamptz,
  347. '1 month'::interval) limit 10;
  348. -- errors
  349. select * from generate_series('2020-01-01 00:00'::timestamptz,
  350. '2020-01-02 03:00'::timestamptz,
  351. '0 hour'::interval);
  352. --
  353. -- Test behavior with a dynamic (time-varying) timezone abbreviation.
  354. -- These tests rely on the knowledge that MSK (Europe/Moscow standard time)
  355. -- moved forwards in Mar 2011 and backwards again in Oct 2014.
  356. --
  357. SET TimeZone to 'UTC';
  358. SELECT '2011-03-27 00:00:00 Europe/Moscow'::timestamptz;
  359. SELECT '2011-03-27 01:00:00 Europe/Moscow'::timestamptz;
  360. SELECT '2011-03-27 01:59:59 Europe/Moscow'::timestamptz;
  361. SELECT '2011-03-27 02:00:00 Europe/Moscow'::timestamptz;
  362. SELECT '2011-03-27 02:00:01 Europe/Moscow'::timestamptz;
  363. SELECT '2011-03-27 02:59:59 Europe/Moscow'::timestamptz;
  364. SELECT '2011-03-27 03:00:00 Europe/Moscow'::timestamptz;
  365. SELECT '2011-03-27 03:00:01 Europe/Moscow'::timestamptz;
  366. SELECT '2011-03-27 04:00:00 Europe/Moscow'::timestamptz;
  367. SELECT '2011-03-27 00:00:00 MSK'::timestamptz;
  368. SELECT '2011-03-27 01:00:00 MSK'::timestamptz;
  369. SELECT '2011-03-27 01:59:59 MSK'::timestamptz;
  370. SELECT '2011-03-27 02:00:00 MSK'::timestamptz;
  371. SELECT '2011-03-27 02:00:01 MSK'::timestamptz;
  372. SELECT '2011-03-27 02:59:59 MSK'::timestamptz;
  373. SELECT '2011-03-27 03:00:00 MSK'::timestamptz;
  374. SELECT '2011-03-27 03:00:01 MSK'::timestamptz;
  375. SELECT '2011-03-27 04:00:00 MSK'::timestamptz;
  376. SELECT '2014-10-26 00:00:00 Europe/Moscow'::timestamptz;
  377. SELECT '2014-10-26 00:59:59 Europe/Moscow'::timestamptz;
  378. SELECT '2014-10-26 01:00:00 Europe/Moscow'::timestamptz;
  379. SELECT '2014-10-26 01:00:01 Europe/Moscow'::timestamptz;
  380. SELECT '2014-10-26 02:00:00 Europe/Moscow'::timestamptz;
  381. SELECT '2014-10-26 00:00:00 MSK'::timestamptz;
  382. SELECT '2014-10-26 00:59:59 MSK'::timestamptz;
  383. SELECT '2014-10-26 01:00:00 MSK'::timestamptz;
  384. SELECT '2014-10-26 01:00:01 MSK'::timestamptz;
  385. SELECT '2014-10-26 02:00:00 MSK'::timestamptz;
  386. SELECT '2011-03-27 00:00:00'::timestamp AT TIME ZONE 'Europe/Moscow';
  387. SELECT '2011-03-27 01:00:00'::timestamp AT TIME ZONE 'Europe/Moscow';
  388. SELECT '2011-03-27 01:59:59'::timestamp AT TIME ZONE 'Europe/Moscow';
  389. SELECT '2011-03-27 02:00:00'::timestamp AT TIME ZONE 'Europe/Moscow';
  390. SELECT '2011-03-27 02:00:01'::timestamp AT TIME ZONE 'Europe/Moscow';
  391. SELECT '2011-03-27 02:59:59'::timestamp AT TIME ZONE 'Europe/Moscow';
  392. SELECT '2011-03-27 03:00:00'::timestamp AT TIME ZONE 'Europe/Moscow';
  393. SELECT '2011-03-27 03:00:01'::timestamp AT TIME ZONE 'Europe/Moscow';
  394. SELECT '2011-03-27 04:00:00'::timestamp AT TIME ZONE 'Europe/Moscow';
  395. SELECT '2011-03-27 00:00:00'::timestamp AT TIME ZONE 'MSK';
  396. SELECT '2011-03-27 01:00:00'::timestamp AT TIME ZONE 'MSK';
  397. SELECT '2011-03-27 01:59:59'::timestamp AT TIME ZONE 'MSK';
  398. SELECT '2011-03-27 02:00:00'::timestamp AT TIME ZONE 'MSK';
  399. SELECT '2011-03-27 02:00:01'::timestamp AT TIME ZONE 'MSK';
  400. SELECT '2011-03-27 02:59:59'::timestamp AT TIME ZONE 'MSK';
  401. SELECT '2011-03-27 03:00:00'::timestamp AT TIME ZONE 'MSK';
  402. SELECT '2011-03-27 03:00:01'::timestamp AT TIME ZONE 'MSK';
  403. SELECT '2011-03-27 04:00:00'::timestamp AT TIME ZONE 'MSK';
  404. SELECT '2014-10-26 00:00:00'::timestamp AT TIME ZONE 'Europe/Moscow';
  405. SELECT '2014-10-26 00:59:59'::timestamp AT TIME ZONE 'Europe/Moscow';
  406. SELECT '2014-10-26 01:00:00'::timestamp AT TIME ZONE 'Europe/Moscow';
  407. SELECT '2014-10-26 01:00:01'::timestamp AT TIME ZONE 'Europe/Moscow';
  408. SELECT '2014-10-26 02:00:00'::timestamp AT TIME ZONE 'Europe/Moscow';
  409. SELECT '2014-10-26 00:00:00'::timestamp AT TIME ZONE 'MSK';
  410. SELECT '2014-10-26 00:59:59'::timestamp AT TIME ZONE 'MSK';
  411. SELECT '2014-10-26 01:00:00'::timestamp AT TIME ZONE 'MSK';
  412. SELECT '2014-10-26 01:00:01'::timestamp AT TIME ZONE 'MSK';
  413. SELECT '2014-10-26 02:00:00'::timestamp AT TIME ZONE 'MSK';
  414. SELECT make_timestamptz(2014, 10, 26, 0, 0, 0, 'MSK');
  415. SELECT make_timestamptz(2014, 10, 26, 1, 0, 0, 'MSK');
  416. SELECT to_timestamp( 0); -- 1970-01-01 00:00:00+00
  417. SELECT to_timestamp( 946684800); -- 2000-01-01 00:00:00+00
  418. SELECT to_timestamp(1262349296.7890123); -- 2010-01-01 12:34:56.789012+00
  419. -- edge cases
  420. SELECT to_timestamp(-210866803200); -- 4714-11-24 00:00:00+00 BC
  421. -- upper limit varies between integer and float timestamps, so hard to test
  422. -- nonfinite values
  423. SELECT to_timestamp(' Infinity'::float);
  424. SELECT to_timestamp('-Infinity'::float);
  425. SELECT to_timestamp('NaN'::float);
  426. SET TimeZone to 'Europe/Moscow';
  427. SELECT '2011-03-26 21:00:00 UTC'::timestamptz;
  428. SELECT '2011-03-26 22:00:00 UTC'::timestamptz;
  429. SELECT '2011-03-26 22:59:59 UTC'::timestamptz;
  430. SELECT '2011-03-26 23:00:00 UTC'::timestamptz;
  431. SELECT '2011-03-26 23:00:01 UTC'::timestamptz;
  432. SELECT '2011-03-26 23:59:59 UTC'::timestamptz;
  433. SELECT '2011-03-27 00:00:00 UTC'::timestamptz;
  434. SELECT '2014-10-25 21:00:00 UTC'::timestamptz;
  435. SELECT '2014-10-25 21:59:59 UTC'::timestamptz;
  436. SELECT '2014-10-25 22:00:00 UTC'::timestamptz;
  437. SELECT '2014-10-25 22:00:01 UTC'::timestamptz;
  438. SELECT '2014-10-25 23:00:00 UTC'::timestamptz;
  439. RESET TimeZone;
  440. SELECT '2011-03-26 21:00:00 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow';
  441. SELECT '2011-03-26 22:00:00 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow';
  442. SELECT '2011-03-26 22:59:59 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow';
  443. SELECT '2011-03-26 23:00:00 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow';
  444. SELECT '2011-03-26 23:00:01 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow';
  445. SELECT '2011-03-26 23:59:59 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow';
  446. SELECT '2011-03-27 00:00:00 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow';
  447. SELECT '2014-10-25 21:00:00 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow';
  448. SELECT '2014-10-25 21:59:59 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow';
  449. SELECT '2014-10-25 22:00:00 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow';
  450. SELECT '2014-10-25 22:00:01 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow';
  451. SELECT '2014-10-25 23:00:00 UTC'::timestamptz AT TIME ZONE 'Europe/Moscow';
  452. SELECT '2011-03-26 21:00:00 UTC'::timestamptz AT TIME ZONE 'MSK';
  453. SELECT '2011-03-26 22:00:00 UTC'::timestamptz AT TIME ZONE 'MSK';
  454. SELECT '2011-03-26 22:59:59 UTC'::timestamptz AT TIME ZONE 'MSK';
  455. SELECT '2011-03-26 23:00:00 UTC'::timestamptz AT TIME ZONE 'MSK';
  456. SELECT '2011-03-26 23:00:01 UTC'::timestamptz AT TIME ZONE 'MSK';
  457. SELECT '2011-03-26 23:59:59 UTC'::timestamptz AT TIME ZONE 'MSK';
  458. SELECT '2011-03-27 00:00:00 UTC'::timestamptz AT TIME ZONE 'MSK';
  459. SELECT '2014-10-25 21:00:00 UTC'::timestamptz AT TIME ZONE 'MSK';
  460. SELECT '2014-10-25 21:59:59 UTC'::timestamptz AT TIME ZONE 'MSK';
  461. SELECT '2014-10-25 22:00:00 UTC'::timestamptz AT TIME ZONE 'MSK';
  462. SELECT '2014-10-25 22:00:01 UTC'::timestamptz AT TIME ZONE 'MSK';
  463. SELECT '2014-10-25 23:00:00 UTC'::timestamptz AT TIME ZONE 'MSK';
  464. --
  465. -- Test that AT TIME ZONE isn't misoptimized when using an index (bug #14504)
  466. --
  467. create temp table tmptz (f1 timestamptz primary key);
  468. insert into tmptz values ('2017-01-18 00:00+00');
  469. explain (costs off)
  470. select * from tmptz where f1 at time zone 'utc' = '2017-01-18 00:00';
  471. select * from tmptz where f1 at time zone 'utc' = '2017-01-18 00:00';