Re: When exactly is a TIMESTAMPTZ converted to the sessions timezone?

Поиск
Список
Период
Сортировка
От Paul Jungwirth
Тема Re: When exactly is a TIMESTAMPTZ converted to the sessions timezone?
Дата
Msg-id 6ccea066-aadc-0289-e229-4c83edd4f8f8@illuminatedcomputing.com
обсуждение исходный текст
Ответ на Re: When exactly is a TIMESTAMPTZ converted to the sessions timezone?  (Bruce Momjian <bruce@momjian.us>)
Список pgsql-general
On 08/09/2018 01:49 PM, Bruce Momjian wrote:
> On Tue, Jul  3, 2018 at 05:00:17PM -0400, Tom Lane wrote:
>> Thomas Kellerer <spam_eater@gmx.net> writes:
>>> A recent discussion around timestamptz behaviour has lead me to question my own understanding on how a TIMESTAMPTZ
isconverted to the session's time zone.
 
>>> I assumed this conversion happens *on the server* before the value is sent to the client.
>>
>> It's done in the datatype's output conversion function.
>>
>>> A co-worker of mine claims that this is purely a client side thing, and that the server will always send the
"plain"UTC value that is stored in a timestamptz column.
 
>>
>> Your co-worker is certainly wrong so far as text output is concerned.
>> If you retrieve data in binary format, though, it looks like you get
>> the raw (un-rotated) timestamp value, so that any conversion would have
>> to be done on the client side.
> 
> Wow, I am kind of surprised by that.  Do any other data types have this
> behavior?

This isn't related to binary-vs-string format, but I think it's often 
overlooked that timestamptz considers your timezone not just to 
stringify the value, but also to truncate it:

db=> create table t (ts timestamp, tstz timestamptz);
CREATE TABLE
Time: 3.154 ms
db=> set timezone='America/Los_Angeles';
SET
Time: 0.303 ms
db=> insert into t (ts, tstz) values ('2018-06-09 19:00:00', '2018-06-09 
19:00:00');
INSERT 0 1
Time: 2.653 ms
db=> select ts, date_trunc('day', ts), tstz, date_trunc('day', tstz) from t;
          ts          |     date_trunc      |          tstz          | 
     date_trunc
---------------------+---------------------+------------------------+------------------------
  2018-06-09 19:00:00 | 2018-06-09 00:00:00 | 2018-06-09 19:00:00-07 | 
2018-06-09 00:00:00-07
(1 row)

Time: 0.438 ms
db=> set timezone='UTC';
SET
Time: 0.227 ms
db=> select ts, date_trunc('day', ts), tstz, date_trunc('day', tstz) from t;
          ts          |     date_trunc      |          tstz          | 
     date_trunc
---------------------+---------------------+------------------------+------------------------
  2018-06-09 19:00:00 | 2018-06-09 00:00:00 | 2018-06-10 02:00:00+00 | 
2018-06-10 00:00:00+00
(1 row)

Are there any other places where timestamptz consults your timezone?

-- 
Paul              ~{:-)
pj@illuminatedcomputing.com


В списке pgsql-general по дате отправления:

Предыдущее
От: Bruce Momjian
Дата:
Сообщение: Re: When exactly is a TIMESTAMPTZ converted to the sessions timezone?
Следующее
От: Bruce Momjian
Дата:
Сообщение: Re: Do we need yet another IDE (SQL development assistant) forPostgreSQL?