今天我遇到了一個奇怪的postgres行為。讓我解釋:
這是我將要處理的表。
=># \d planning_time_slot
Table "public.planning_time_slot"
Column | Type | Collation | Nullable | Default
------------- --------------------------- ----------- ---------- ------------------------------------------------
id | integer | | not null | nextval('planning_time_slot_id_seq'::regclass)
planning_id | integer | | not null |
day | character varying(255) | | not null |
start_time | time(0) without time zone | | not null |
end_time | time(0) without time zone | | not null |
day_id | integer | | not null | 0
Indexes:
"planning_time_slot_pkey" PRIMARY KEY, btree (id)
"idx_a9e3f3493d865311" btree (planning_id)
Foreign-key constraints:
"fk_a9e3f3493d865311" FOREIGN KEY (planning_id) REFERENCES planning(id)
我想做的是:
select * from planning_time_slot where start_time > (CURRENT_TIME AT TIME ZONE 'Europe/Paris');
但似乎 postgres 正在比較時區轉換之前的時間。這是我的測驗:
=># select * from planning_time_slot where start_time > (CURRENT_TIME AT TIME ZONE 'Europe/Paris');
id | planning_id | day | start_time | end_time | day_id
----- ------------- ----- ------------ ---------- --------
157 | 6 | su | 16:00:00 | 16:30:00 | 0
(1 row)
=># select (CURRENT_TIME AT TIME ZONE 'Europe/Paris');
timezone
--------------------
16:35:48.591002 02
(1 row)
當我嘗試使用很多條目時,似乎比較是在 start_time 和 CURRENT_TIME 之間完成的,沒有時區轉換。
為了您的資訊,我也嘗試過:
select * from planning_time_slot where start_time > timezone('Europe/Paris', CURRENT_TIME);
它具有完全相同的結果。
我還嘗試使用 time zone將列型別更改為time(0)。它產生完全相同的結果。
最后一點很重要。我真的需要設定我想要的時區,因為稍后我將根據其他內容動態更改它。所以它不會每次都是“歐洲/巴黎”。
有沒有人有線索或提示?
psql (PostgreSQL) 11.2 (Debian 11.2-1.pgdg90 1)
uj5u.com熱心網友回復:
我認為你有更深層次的問題。
您有一天、開始時間和結束時間,但沒有時區概念。所以這將意味著不同的東西取決于觀察者的時區。
我認為您應該添加一個tz列來存盤該資訊所在的時區。然后您可以獲得這樣的開始時間:
WHERE (day start_time) AT TIME ZONE tz > current_timestamp
uj5u.com熱心網友回復:
(CURRENT_TIME AT TIME ZONE 'Europe/Paris')例如,是17:52:17.872082 02。但在內部它是15:52:17.872082 00。time 和 timetz(帶時區的時間)都存盤為 UTC,唯一的區別是 timetz與時區一起存盤。更改時區不會改變它代表的時間點。
所以當你將它與時間進行比較時......
# select '17:00:00'::time < '17:52:17 02'::timetz;
?column?
----------
f
那真是……
# select '17:00:00'::time < '15:52:17'::time;
?column?
----------
f
將 timetz 投射到時間將關閉時區。
test=# select (CURRENT_TIME AT TIME ZONE 'Europe/Paris')::time;
timezone
-----------------
17:55:57.099863
(1 row)
test=# select '17:00:00' < (CURRENT_TIME AT TIME ZONE 'Europe/Paris')::time;
?column?
----------
t
請注意,這種比較僅在您想根據墻上的時鐘存盤在 17:00 發生某事的概念時才有意義。例如,如果您有一個手機游戲,其中一個事件在“17:00”開始,即用戶所在的 17:00。這被稱為“浮動時區”。
- 假設
day是“星期幾”,我建議將其存盤為整數。比較和本地化更容易。 - 不要考慮單獨的開始時間和結束時間,而是考慮單個
timerange. 然后您可以使用范圍運算子。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/325492.html
標籤:PostgreSQL 约会时间 时区
上一篇:如何將年齡計算為年、月和日?
下一篇:計算重疊間隔的處理時間
