Gunakan timestamp with time zone
(timestamptz
) untuk perhitungan.
Waktu untuk alarm dapat berupa time [without time zone]
.
Tapi Anda harus menyimpan zona waktu secara eksplisit untuk setiap baris.
Tidak pernah gunakan time with time zone
Ini adalah tipe yang rusak secara logis, penggunaannya tidak disarankan oleh PostgreSQL. Manual:
Penyiapan demo:
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.
Itu harus zona waktu nama (bukan singkatan) untuk memperhitungkan DST. Terkait:
Dapatkan alarm yang cocok untuk "hari ini":
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)
... merakittimestamp [without time zone]
Bisa juganow()::date + t
untuk "hari ini".AT WITH TIME ZONE tz
... tempatkan stempel waktu di zona waktu yang disimpan, menghasilkantimestamptz
.AT WITH TIME ZONE 'UTC'
... dapatkan sesuaitimestamp
UTC::time
... cara paling sederhana untuk mengekstrak komponen waktu.
Di sini Anda dapat mencari nama zona waktu :
SELECT *
FROM pg_timezone_names
WHERE name ~~* '%sing%'
LIMIT 10
SQL Fiddle mendemonstrasikan musim panas / musim dingin.