sql >> Databasteknik >  >> RDS >> PostgreSQL

Ange en tidszon som ska användas som referenstidszon

Du måste spara tidszonsförskjutningen dessutom till timestamp .

Som @Milen redan förklarat (och länkat till manualen ):en timestamp sparar bara en tidpunkt (som abstrakt värde). Tidszonsmodifieraren är inte sparas, tjänar den bara till att justera timestamp i förhållande till UTC .

Tänk på följande 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;

Kör den lokalt för att se. Var särskilt uppmärksam på detaljerna i VID TIDZON konstruktion, och hur jag extraherar tidszonen från (lokal!) timestamp with time zone .
now() returnerar timestamp with time zone eller timestamptz för kort.

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

timestamp_at_origin visar tidsstämpeln med tidszonen som ses vid dess ursprung. Om jag förstod din fråga så är det det du letar efter.
Du kan förbättra formateringen ytterligare.

Du kanske är intresserad av denna relaterade fråga som kastar lite ljus över tidszonernas oklarheter och fallgropar.



  1. MySQL Count matchande poster från flera tabeller

  2. Kan inte använda objekt av typen PDOStatement som array

  3. Mysql - dynamisk SQL tillåts inte i triggern

  4. java.sql.SQLEundantag:ORA-03115:nätverksdatatyp eller representation som inte stöds