Sử dụng dấu thời gian timestamp with time zone
(timestamptz
) để tính toán.
Thời gian báo thức có thể là time [without time zone]
.
Nhưng bạn phải lưu múi giờ rõ ràng cho mọi hàng.
Không bao giờ sử dụng time with time zone
Đây là một loại bị hỏng về mặt logic, việc sử dụng nó không được PostgreSQL khuyến khích. Hướng dẫn:
Thiết lập 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.
Nó phải là múi giờ tên (không phải chữ viết tắt) để tính DST. Có liên quan:
Nhận báo thức phù hợp cho "hôm nay":
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)
... lắp ráptimestamp [without time zone]
Cũng có thể chỉ lànow()::date + t
cho "hôm nay". -
AT WITH TIME ZONE tz
... đặt dấu thời gian tại múi giờ đã lưu, dẫn đếntimestamptz
. -
AT WITH TIME ZONE 'UTC'
... lấy theo UTCtimestamp
-
::time
... cách đơn giản nhất để trích xuất thành phần thời gian.
Tại đây, bạn có thể tra cứu tên múi giờ :
SELECT *
FROM pg_timezone_names
WHERE name ~~* '%sing%'
LIMIT 10
SQL Fiddle trình diễn mùa hè / mùa đông.