Postgresql
如何比較多個日期的日期時間部分
我有一個包含各種記錄的 postgresql 數據庫,這些記錄的日期列看起來像
2020-10-12 12:45:55
. 我想建構一個查詢,以查找時間戳在任何一天的活動,但在實際時間部分的一天的 22:00:00 和第二天的 05:00:00 之間。如何忽略日期而只關注此列的時間部分?我想我需要拆分日期列,但仍然可以在剩餘的時間字元串上使用
<
和運算符。>
它有一個日期列,看起來像
2020-10-12 12:45:55
這不是日期列,而是時間戳(日期和時間)。假設類型
timestamp
,不是timetamptz
嗎?(您應該始終披露實際的表定義。)SELECT * FROM tbl WHERE timestamp_in_disguise::time >= '22:00' OR timestamp_in_disguise::time <= '05:00';
看:
或者:
... WHERE timestamp_in_disguise::time NOT BETWEEN '05:00' AND '22:00';
第一個包括界限,您可以根據需要進行調整。
第二個使用
BETWEEN
,它總是包括邊界 - 所以在否定表達式中排除它們。您仍然可以使用 hack 來包含基於 Postgres 在其目前實現中以微秒解析度(6 個小數位)儲存時間和時間戳的內部知識的界限。
... WHERE timestamp_in_disguise::time NOT BETWEEN '05:00:00.000001' AND '21:59:59.999999';
但我強烈反對後者。基於實現細節的建構是脆弱和醜陋的。
將字元串文字向右轉換是可選的,因為它們的類型是從類型化列派生的。
實際上,如果我們與您打交道,則
timestamptz
需要定義世界上應該是 22:00 等的時間。(您可能也需要考慮一下timestamp
。)請參閱:關於
BETWEEN
並包括下限和上限:如果您經常執行此類查詢,請考慮使用表達式索引:
CREATE INDEX ON tbl ((timestamp_in_disguise::time)); -- parentheses needed