Received: from malur.postgresql.org ([2a02:16a8:dc51::56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1fweLY-0008EJ-TW for pgsql-docs@arkaria.postgresql.org; Mon, 03 Sep 2018 02:12:09 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1fweLX-0000G4-8r for pgsql-docs@arkaria.postgresql.org; Mon, 03 Sep 2018 02:12:07 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1fweLX-0000Fv-2y for pgsql-docs@lists.postgresql.org; Mon, 03 Sep 2018 02:12:07 +0000 Received: from momjian.us ([72.94.173.45]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1fweLS-0006Og-WA for pgsql-docs@postgresql.org; Mon, 03 Sep 2018 02:12:06 +0000 Received: from bruce by momjian.us with local (Exim 4.84_2) (envelope-from ) id 1fweLP-0008GI-EM; Sun, 02 Sep 2018 22:11:59 -0400 Date: Sun, 2 Sep 2018 22:11:59 -0400 From: Bruce Momjian To: Tom Lane Cc: PostgreSQL-documentation Subject: Re: AT TIME ZONE correction Message-ID: <20180903021159.GC25700@momjian.us> References: <20180901225557.GA22406@momjian.us> <24277.1535844643@sss.pgh.pa.us> <20180901233736.GA25700@momjian.us> <20180902032821.GB25700@momjian.us> <14024.1535912518@sss.pgh.pa.us> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="kXdP64Ggrk/fb43R" Content-Disposition: inline In-Reply-To: <14024.1535912518@sss.pgh.pa.us> User-Agent: Mutt/1.5.23 (2014-03-12) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --kXdP64Ggrk/fb43R Content-Type: text/plain; charset=us-ascii Content-Disposition: inline fOn Sun, Sep 2, 2018 at 02:21:58PM -0400, Tom Lane wrote: > Bruce Momjian writes: > > ! The AT TIME ZONE construct allows the addition, > > ! conversion, and removal of time zones for time stamp values. > linkend="functions-datetime-zoneconvert-table"/> shows its > > variants. > > Maybe it'd be more to the point to say that it allows conversion between > "timestamp with time zone" and "timestamp without time zone". > > > ! The first example takes a time stamp without time zone and interprets > > ! it in the MST time zone (UTC-7), returning a time stamp with time > > ! zone value which is displayed in local time (PST, UTC-8). The second > > ! example takes a time stamp with time zone value (EST, UTC-5) and > > ! converts it to the date and time in MST (UTC-7) without time zone. > > ! Basically, the first example takes the date and time and puts it in > > ! the specified time zone. The second example takes a time stamp with > > ! time zone and shifts it to the specified time zone. (No time zone > > ! designation is returned.) > > I still find this to be more confusing than helpful. In particular, > I do not think that it's possible to explain this behavior clearly > without mentioning that timestamp with time zone values are always > stored in UTC and what AT TIME ZONE really does is convert between UTC > and the specified zone (in a direction dependent on which type is > supplied as argument). Agreed. The more I dig into this the more I learn. I have developed the attached patch which I hope this time is an improvement. Is there any value to showing these two queries which show how calling AT TIME ZONE twice cancels itself out: SELECT '2018-09-02 07:09:19'::timestamp AT TIME ZONE 'America/Chicago' AT TIME ZONE 'America/Chicago'; timezone --------------------- 2018-09-02 07:09:19 SELECT '2018-09-02 07:09:19-04'::timestamptz AT TIME ZONE 'America/Chicago' AT TIME ZONE 'America/Chicago'; timezone ------------------------ 2018-09-02 07:09:19-04 or this one which shows how to convert a date/time from one time zone to another: SELECT '2018-09-02 07:09:19'::timestamp AT TIME ZONE 'Asia/Tokyo' AT TIME ZONE 'America/Chicago'; timezone --------------------- 2018-09-01 17:09:19 -- Bruce Momjian http://momjian.us EnterpriseDB http://enterprisedb.com + As you are, so once was I. As I am, so you will be. + + Ancient Roman grave inscription + --kXdP64Ggrk/fb43R Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="time_zone.diff" diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml new file mode 100644 index bb794e0..5e3d54f *** a/doc/src/sgml/func.sgml --- b/doc/src/sgml/func.sgml *************** SELECT date_trunc('year', TIMESTAMP '200 *** 8082,8091 **** ! The AT TIME ZONE construct allows conversions ! of time stamps to different time zones. shows its ! variants. --- 8082,8092 ---- ! The AT TIME ZONE converts time ! stamp without time zone to/from ! time stamp with time zone, and ! time values to different time zones. shows its variants.
*************** SELECT TIMESTAMP '2001-02-16 20:38:40' A *** 8145,8153 **** SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'MST'; Result: 2001-02-16 18:38:40 ! The first example takes a time stamp without time zone and interprets it as MST time ! (UTC-7), which is then converted to PST (UTC-8) for display. The second example takes ! a time stamp specified in EST (UTC-5) and converts it to local time in MST (UTC-7). --- 8146,8158 ---- SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'MST'; Result: 2001-02-16 18:38:40 ! The first example adds a time zone to a value that lacks it. ! The second example shifts the time stamp with time zone value ! to the specified time zone, and returns the value without a ! time zone. This allows storage and display of values different ! from the current TimeZone value. Converting ! time values to other time zones uses the currently ! active time zone rules since no date is present. --kXdP64Ggrk/fb43R--