sql >> Databasteknik >  >> RDS >> PostgreSQL

Redovisning av sommartid i Postgres, vid val av schemalagda objekt

Använd timestamp with time zone (timestamptz ) för beräkningar.
Tiderna för larm kan vara time [without time zone] .
Men du måste spara tidszonen uttryckligen för varje rad.

Aldrig använd time with time zone Det är en logiskt trasig typ, dess användning avskräcks av PostgreSQL. Manualen:

Demoinställningar:

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.

Det måste vara tidszons namn (inte förkortningar) för att redogöra för sommartid. Relaterat:

Få matchande larm för "idag":

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) ... montera timestamp [without time zone] Kan också bara vara now()::date + t för "idag".
  • AT WITH TIME ZONE tz ... placera tidsstämpel i den sparade tidszonen, vilket resulterar i timestamptz .
  • AT WITH TIME ZONE 'UTC' ... få enligt UTC timestamp
  • ::time ... enklaste sättet att extrahera tidskomponenten.

Här kan du slå upp tidszonnamn :

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

SQL Fiddle demonstrerar sommar/vinter.



  1. POSTGRES kontrollera om ett angivet värde finns i kolumnen för typarray

  2. Hur skapar man ett event som pågår var 24:e timme?

  3. Hur hittar man i Django en term som är en del av en sträng istället för att innehålla den strängen?

  4. Oracle DB Server + APEX + ORDS + JasperReports from scratch (Del 4)