Postgresql

如何比較多個日期的日期時間部分

  • April 23, 2021

我有一個包含各種記錄的 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

引用自:https://dba.stackexchange.com/questions/290299