Użyj timestamp with time zone
(timestamptz
) do obliczeń.
Czasy alarmów mogą być time [without time zone]
.
Ale musisz zapisać strefę czasową wyraźnie dla każdego wiersza.
Nigdy użyj time with time zone
Jest to logicznie zepsuty typ, jego użycie jest odradzane przez PostgreSQL. Podręcznik:
Konfiguracja demonstracyjna:
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.
To musi być strefa czasowa nazwy (nie skróty), aby uwzględnić czas letni. Powiązane:
Pobierz pasujące alarmy dla „dzisiaj”:
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)
... złóżtimestamp [without time zone]
Może też być po prostunow()::date + t
na „dzisiaj”.AT WITH TIME ZONE tz
... umieść znacznik czasu w zapisanej strefie czasowej, w wyniku czegotimestamptz
.AT WITH TIME ZONE 'UTC'
... uzyskaj zgodnie z UTCtimestamp
::time
... najprostszy sposób na wyodrębnienie składnika czasu.
Tutaj możesz wyszukać nazwy stref czasowych :
SELECT *
FROM pg_timezone_names
WHERE name ~~* '%sing%'
LIMIT 10
Skrzypce SQL demonstracja lato/zima.