Specify a time zone to use as the reference time zone

后端 未结 4 1737
鱼传尺愫
鱼传尺愫 2021-01-07 09:06

Based on the first two answers, the question was unclear as originally posted, thus I am completely rewriting it:

The following question is concerned only w

相关标签:
4条回答
  • 2021-01-07 09:21

    You can do your select with an at time zone operator:

    select insertTs at time zone 'CST' from table
    

    See more here.

    0 讨论(0)
  • 2021-01-07 09:22

    I always store times in GMT so that the client can convert based on it's current GMT offset (the GMT offest is available in most language).

    I write C# - so I can easily convert all DateTime objects to GMT using DateTime.ToUniversalTime() as I store data in the database.

    I am not sure what language you are using or how to convert all times to GMT in postgressql, but from a logic standpoint - storing all times in GMT will allow a uniform time zone that all other time zones can easily relate to.

    Hope this helps!

    Greenwich Mean Time

    0 讨论(0)
  • 2021-01-07 09:26

    When inserting a value into a timestamp with time zone field what actually happens is the timestamp is converted to UTC. Another matter altogether is to what time zone that value is converted on output. There are a few ways to control that:

    When a timestamp with time zone value is output, it is always converted from UTC to the current timezone zone, and displayed as local time in that zone. To see the time in another time zone, either change timezone or use the AT TIME ZONE construct (see Section 9.9.3).

    0 讨论(0)
  • 2021-01-07 09:27

    You have to save the time zone offset in addition to the timestamp.

    As @Milen already explained (and linked to the manual): a timestamp only saves a point in time (as abstract value). The time zone modifier is not saved, it only serves to adjust the timestamp relative to UTC.

    Consider the following demo:

    -- DROP TABLE tbl;
    CREATE TEMP TABLE tbl (id int, myts timestamptz, mytz interval);
    
    INSERT INTO tbl VALUES
     (1, now()                , EXTRACT (timezone from now()) * interval '1s')
    ,(2, '2012-01-01 00:00-05', interval '-5h')
    ,(3, '2012-01-01 00:00+04', interval '4h')
    ,(4, '2012-11-11 20:30+03', interval '3h');
    
    SELECT *
          ,(myts AT TIME ZONE mytz)::text
           || CASE WHEN mytz > '0:0' THEN '+' ELSE '' END
           || to_char(mytz, 'FMHH24:mi') AS timestamp_at_origin
    FROM tbl;
    

    Run it locally to see. Pay special attention to the details of the AT TIME ZONE construct, and how I extract the time zone from the (local!) timestamp with time zone.
    now() returns timestamp with time zone or timestamptz for short.

    EXTRACT (timezone from now()) * interval '1s'
    

    timestamp_at_origin displays the timestamp with time zone as seen at its origin. If I understood your question, then that is what you are looking for.
    You could further improve formatting.

    You may be interested in this related question which sheds some light on the ambiguities and pitfalls of time zones.

    0 讨论(0)
提交回复
热议问题