sql >> Database >  >> RDS >> PostgreSQL

Geef een tijdzone op om als referentietijdzone te gebruiken

U moet ook de tijdzone-offset opslaan naar de timestamp .

Zoals @Milen al heeft uitgelegd (en gekoppeld aan de handleiding ):een timestamp slaat alleen een punt in de tijd op (als abstracte waarde). De tijdzonemodifier is niet opgeslagen, het dient alleen om de timestamp . aan te passen ten opzichte van UTC .

Beschouw de volgende 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;

Voer het lokaal uit om te zien. Besteed speciale aandacht aan de details van de IN TIJDZONE construeren, en hoe ik de tijdzone extraheer uit de (lokale!) timestamp with time zone .
now() retourneert timestamp with time zone of timestamptz in het kort.

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

timestamp_at_origin geeft de tijdstempel weer met de tijdzone zoals te zien aan de oorsprong. Als ik uw vraag begrepen heb, dan is dat wat u zoekt.
U zou de opmaak verder kunnen verbeteren.

Mogelijk bent u geïnteresseerd in deze gerelateerde vraag die enig licht werpt op de dubbelzinnigheden en valkuilen van tijdzones.



  1. Oracle Join-voorwaarde met Top 1

  2. Waarde die is opgeslagen in een PL/SQL-variabele doorgeven aan een IN-clausule

  3. Hoe kan ik vanuit Ant verbinding maken met een Oracle-database met de tnsname?

  4. randomiseren van grote dataset