日期范围之间的 PostgreSQL 查询

Shihab Sikder 2023年1月30日 2022年5月14日
  1. PostgreSQL 中的范围类型
  2. 在 Postgres 中使用 INTERVAL 和日期类型的差异
  3. 在 Postgres 的日期类型中使用 between
  4. 在 Postgres 的日期类型中使用 daterange
日期范围之间的 PostgreSQL 查询

我们将在本文中讨论 PostgreSQL 中不同类型的范围。

PostgreSQL 中的范围类型

默认情况下,Postgres 提供了一些范围来比较这些值。

Postgres 中有一个 daterange 类型来比较日期。此外,我们可以使用 between 来比较日期。

为了演示,让我们创建一个表并用一些数据填充它。

架构 SQL:

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

填充表后,执行此 Postgres Query SQL。

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)

在 Postgres 中使用 INTERVAL 和日期类型的差异

假设你想要所有姓名以及 id、谁登录数据库以及到目前为止花费了多少天,并且你只想查看最近 120 天登录的人。

查询 SQL:

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)

在 Postgres 的日期类型中使用 between

如果你想查看谁在 2021 年和当前日期之间登录,可以运行以下 SQL 命令。

查询 SQL:

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。因此,当你尝试插入或编写查询时,请确保使用 Postgres 数据库支持的格式。

这里是 Postgres 中日期数据类型格式的文档。

在 Postgres 的日期类型中使用 daterange

假设你想查看在日期范围之间登录的用户。例如,2021 年 6 月 6 日至 2022 年 3 月 10 日。

执行以下 SQL 命令:

查询 SQL:

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

我们使用了::daterange,这意味着我们将范围类型转换为日期数据类型。 @> 称为范围运算符,它也可以用于不同数据类型的其他范围查询。

输出:

 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 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

相关文章 - PostgreSQL Date