sql >> Database >  >> RDS >> PostgreSQL

Rekening houden met DST in Postgres, bij het selecteren van geplande items

Gebruik timestamp with time zone (timestamptz ) voor berekeningen.
Tijden voor alarmen kunnen time [without time zone] zijn .
Maar je moet de tijdzone opslaan expliciet voor elke rij.

Nooit gebruik time with time zone Het is een logisch gebroken type, het gebruik ervan wordt ontmoedigd door PostgreSQL. De handleiding:

Demo-instellingen:

CREATE TABLE alarm(name text, t time, tz text);
INSERT INTO alarm VALUES
  ('Alfred', '04:00', 'Europe/Stockholm') -- Alfred sets an alarm for 4 AM.
, ('Lotta',  '05:00', 'Europe/Stockholm') -- Lotta sets an alarm for 5 AM. 
, ('Sharon', '11:00', 'Asia/Singapore');  -- Sharon has set an alarm for 11 AM.

Het moeten tijdzone namen zijn (geen afkortingen) om rekening te houden met DST. Gerelateerd:

Krijg overeenkomende alarmen voor "vandaag":

SELECT *
FROM   alarm
WHERE  (('2012-07-01'::date + t) AT TIME ZONE tz AT TIME ZONE 'UTC')::time
       = '03:00'::time
  • ('2012-7-1'::date + t) ... assembleer timestamp [without time zone] Kan ook gewoon now()::date + t . zijn voor "vandaag".
  • AT WITH TIME ZONE tz ... plaats een tijdstempel in de opgeslagen tijdzone, wat resulteert in timestamptz .
  • AT WITH TIME ZONE 'UTC' ... ontvang volgens UTC timestamp
  • ::time ... eenvoudigste manier om de tijdcomponent te extraheren.

Hier kunt u tijdzonenamen :

SELECT *
FROM   pg_timezone_names
WHERE  name ~~* '%sing%'
LIMIT  10

SQL Fiddle zomer / winter demonstreren.



  1. Verwijder rare tekens (A met hoed) uit de SQL Server varchar-kolom

  2. PostgreSQL:Hoe stel ik het zoekpad in op gebruikersniveau?

  3. Omgaan met Unicode-reeksen in postgresql

  4. MySQL met JOIN gebruikt geen index