PostgreSQL 中日期範圍之間的查詢

Shihab Sikder 2023年1月30日
  1. PostgreSQL 中的日期範圍
  2. PostgreSQL 中使用日期的間隔和差異查詢日期範圍
  3. 在 PostgreSQL 中使用 between 查詢日期範圍
  4. 在 PostgreSQL 中使用 daterange 型別查詢日期範圍
PostgreSQL 中日期範圍之間的查詢

本文將討論不同型別的範圍來比較 PostgreSQL 中的日期。

PostgreSQL 中的日期範圍

預設情況下,PostgreSQL 提供了一些範圍來比較這些值。特別是,我們可以使用 daterangebetween 來比較日期。

為了演示,讓我們建立一個表並用一些資料填充它。

CREATE TABLE logger(
    id SERIAL PRIMARY KEY,
    name VARCHAR (255) NOT NULL,
    login_date DATE NOT NULL DEFAULT CURRENT_DATE
);

輸出:

postgres=# select * from logger;
 id | name  | login_date
----+-------+------------
  1 | Jhon  | 2020-06-06
  2 | Alice | 2022-06-06
  3 | Bon   | 2021-06-06
  4 | Trude | 2020-02-02
  5 | Jene  | 2022-02-22
  6 | Dan   | 2022-01-20
(6 rows)

PostgreSQL 中使用日期的間隔和差異查詢日期範圍

假設你想要登入到資料庫的人的所有姓名(帶有 id)以及他們到今天為止的天數。你只想檢視過去 120 天內登入的使用者。

示例程式碼:

SELECT id, name, now() - login_date as time_spent from logger
WHERE login_date> (CURRENT_DATE - INTERVAL '120 days');

在這裡,你可以在間隔中輸入小時、天、月和年。

輸出:

 id | name |       time_spent
----+------+-------------------------
  5 | Jene | 21 days 11:44:35.790685
  6 | Dan  | 54 days 11:44:35.790685
(2 rows)

在 PostgreSQL 中使用 between 查詢日期範圍

你可以執行下面的 SQL 命令來檢視誰在 2021 年和當前日期之間登入。

postgres-# WHERE login_date between '2021-01-01' AND CURRENT_DATE;
 id | name | login_date
----+------+------------
  3 | Bon  | 2021-06-06
  5 | Jene | 2022-02-22
  6 | Dan  | 2022-01-20
(3 rows)

這裡日期資料型別的格式是 YYYY-MM-DD。因此,當你嘗試插入或編寫查詢時,請確保使用 PostgreSQL 資料庫支援的格式。

這裡是 PostgreSQL 中日期資料型別格式的文件。

在 PostgreSQL 中使用 daterange 型別查詢日期範圍

現在,假設你想檢視在日期範圍(例如 2021-06-06 到 2022-03-10)之間登入的使用者。讓我們建立查詢。

SELECT *
FROM logger
WHERE '[2021-06-06, 2022-03-10]'::daterange @> login_date;

在這裡,我們使用::daterange,這意味著我們將範圍型別轉換為日期資料型別。 @> 稱為範圍運算子,也可用於其他不同資料型別的範圍查詢。

輸出:

postgres-# WHERE '[2021-06-06, 2022-03-10]'::daterange @> login_date;
 id | name | login_date
----+------+------------
  3 | Bon  | 2021-06-06
  5 | Jene | 2022-02-22
  6 | Dan  | 2022-01-20
(3 rows)

此外,你也可以在範圍內使用 CURRENT_DATE。請記住,在方括號內,第一個是開始日期,第二個是範圍的結束日期。

對於結束日期,你也可以寫 infinity。你可以訪問網站此處瞭解有關日期範圍的更多資訊。

作者: Shihab Sikder
Shihab Sikder avatar Shihab Sikder avatar

I'm Shihab Sikder, a professional Backend Developer with experience in problem-solving and content writing. Building secure, scalable, and reliable backend architecture is my motive. I'm working with two companies as a part-time backend engineer.

LinkedIn Website