sql >> Databáze >  >> RDS >> PostgreSQL

Účtování DST v Postgresu při výběru naplánovaných položek

Použijte timestamp with time zone (timestamptz ) pro výpočty.
Časy pro budíky mohou být time [without time zone] .
Musíte však uložit časové pásmo explicitně pro každý řádek.

Nikdy použijte time with time zone Je to logicky rozbitý typ, od jeho používání odrazuje PostgreSQL. Příručka:

Nastavení ukázky:

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.

Musí to být názvy časového pásma (nikoli zkratky) k zohlednění DST. Související:

Získejte odpovídající budíky pro „dnes“:

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) ... sestavit timestamp [without time zone] Může být také jen now()::date + t pro „dnes“.
  • AT WITH TIME ZONE tz ... umístit časové razítko do uloženého časového pásma, výsledkem je timestamptz .
  • AT WITH TIME ZONE 'UTC' ... získat podle UTC timestamp
  • ::time ... nejjednodušší způsob, jak extrahovat časovou složku.

Zde můžete vyhledat názvy časových pásem :

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

SQL Fiddle demonstrující léto / zimu.



  1. Dotaz na porovnání dat v SQL

  2. Jak se dotazovat na hodnoty pomocí zástupných znaků v PostgreSQL hstore

  3. Jak zabezpečit Galera Cluster – 8 tipů

  4. Jak oddělit (rozdělit) řetězec čárkou v uložené proceduře SQL Server