Re: Clarifying "timestamp with time zone" - Mailing list pgsql-general

From Adrian Klaver
Subject Re: Clarifying "timestamp with time zone"
Date
Msg-id e45c281a-3d84-7b07-dcaa-836047a9d788@aklaver.com
Whole thread Raw
In response to Re: Clarifying "timestamp with time zone"  (Jeremy Finzel <finzelj@gmail.com>)
List pgsql-general
On 06/18/2018 06:24 AM, Jeremy Finzel wrote:
> 
> 
> On Fri, Jun 15, 2018 at 2:57 PM, Adrian Klaver 
> <adrian.klaver@aklaver.com <mailto:adrian.klaver@aklaver.com>> wrote:
> 
>     On 06/15/2018 12:24 PM, Jeremy Finzel wrote:
> 
>         Hello!
> 
>         We often prefer to use timestamptz or "timestamp with time zone"
>         in our environment because of its actually storing "objective
>         time" with respect to UTC.  But in my own work experience, I
>         have scarcely encountered a case where business users, and
>         software engineers, do not actually think it means the opposite.
> 
>         When I say "timestamp with time zone", people think the data is
>         saved *in* a specific time zone, whereas in reality, the
>         opposite is true.  It is really more like "timestamp UTC" or you
>         even could say "timestamp at UTC".  When you query this of
>         course, then it shows you the time offset based on your client
>         timezone setting.
> 
>         I do believe this is part of the SQL standard, but I have found
>         that it creates great confusion.  I think many devs choose
>         timestamp instead of timestamptz because they don't really
>         understand that timestamptz gives you UTC time storage built-in.
> 
>         That of course means that if you have multiple servers that run
>         in a different time zone, and you want to replicate that data to
>         a centralized location, you can easily figure out what objective
>         time a record changed, for instance, not knowing anything about
>         what time zone the source system is in.
> 
>         So it seems to me that "timestamp with time zone" is a misnomer
>         in a big
> 
> 
>     It actually is. It is just one timezone though, UTC.
> 
>         way, and perhaps it's worth at least clarifying the docs about
>         this, or
> 
> 
>     https://www.postgresql.org/docs/10/static/datatype-datetime.html#DATATYPE-TIMEZONES
>     <https://www.postgresql.org/docs/10/static/datatype-datetime.html#DATATYPE-TIMEZONES>
> 
>     "For timestamp with time zone, the internally stored value is always
>     in UTC (Universal Coordinated Time, traditionally known as Greenwich
>     Mean Time, GMT). An input value that has an explicit time zone
>     specified is converted to UTC using the appropriate offset for that
>     time zone. If no time zone is stated in the input string, then it is
>     assumed to be in the time zone indicated by the system's TimeZone
>     parameter, and is converted to UTC using the offset for the timezone
>     zone."
> 
>     How should the above be clarified?
> 
> 
> Actually, that is a really good description.  But I would say the 
> problem is it does not have a prominent place on the page, and that many 
> people reading the docs will make enough assumptions about the data 
> types before they get down to this part of the page.  What is displayed 
> as nitty-gritty details down the page should be essential reading for 
> any user of postgres wanting to know how to decide between timestamp and 
> timestamptz.
> 
> There are some descriptions that tend to mislead that perhaps could be 
> clarified.  For example, at the top of the page, timestamptz is 
> described as "both date and time, with time zone".  Given what we all 
> seem to acknowledge is a misleading description, I think we ought to 
> either change this to summarize the above very helpful description, 
> perhaps "both date and time, in UTC" or some such idea.
> 
> I like the idea of making that note that is now nested deep in the 
> example section very prominent at the top of the page, perhaps as one of 
> these special notes, given how critical timestamps are for nearly any 
> relational database use.
> 
> Thoughts?

Time/dates/timestamps are complicated and there are no end of 'if, and 
and buts'. My suggestion would be a note at the top of the page that 
says read through this section at least twice and then come back and do 
that again. Other gotchas in the section that I have seen in posts to 
this list:

"The SQL standard differentiates timestamp without time zone and 
timestamp with time zone literals by the presence of a “+” or “-” symbol 
and time zone offset after the time. Hence, according to the standard,

TIMESTAMP '2004-10-19 10:23:54'

is a timestamp without time zone, while

TIMESTAMP '2004-10-19 10:23:54+02'

is a timestamp with time zone. PostgreSQL never examines the content of 
a literal string before determining its type, and therefore will treat 
both of the above as timestamp without time zone.
To ensure that a literal is treated as timestamp with time zone, give it 
the correct explicit type:

TIMESTAMP WITH TIME ZONE '2004-10-19 10:23:54+02'

In a literal that has been determined to be timestamp without time zone, 
PostgreSQL will silently ignore any time zone indication. That is, the 
resulting value is derived from the date/time fields in the input value, 
and is not adjusted for time zone."


"One should be wary that the POSIX-style time zone feature can lead to 
silently accepting bogus input, since there is no check on the 
reasonableness of the zone abbreviations. For example, SET TIMEZONE TO 
FOOBAR0 will work, leaving the system effectively using a rather 
peculiar abbreviation for UTC. Another issue to keep in mind is that in 
POSIX time zone names, positive offsets are used for locations west of 
Greenwich. Everywhere else, PostgreSQL follows the ISO-8601 convention 
that positive timezone offsets are east of Greenwich."




> 
> Thanks,
> Jeremy
> 


-- 
Adrian Klaver
adrian.klaver@aklaver.com


pgsql-general by date:

Previous
From: Jeremy Finzel
Date:
Subject: Re: Clarifying "timestamp with time zone"
Next
From: Sherrylyn Branchaw
Date:
Subject: What to do when dynamic shared memory control segment is corrupt