Postgres 中的约会安排:查询约会的可用时间?

Appointment scheduling in Postgres: querying available times for appointments?

我有一个简单的时间表table如下:

CREATE TABLE provider_schedule(
    id SERIAL PRIMARY KEY,
    provider_id uuid,

    date_from timestamptz NOT null,
    date_to timestamptz NOT null,

    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),

    FOREIGN KEY (provider_id) REFERENCES app.providers (cognito_id) ON UPDATE CASCADE
);

我在这里插入一些可用时间(“2020-05-12T19:00:00+00:00”到“2020-05-12T23:00:00+00:00”):

insert into app.provider_schedule (provider_id, date_from, date_to) 
values 
('ffc8631f-22d6-4519-b738-793a74cab731', '2020-05-12T19:00:00+00:00','2020-05-12T23:00:00+00:00');

但是当这样查询时,returns没有结果,当时间明显在计划之间时?

select providers.first_name, providers.last_name, provider_schedule.date_from, provider_schedule.date_to 
FROM app.provider_schedule, app.providers
where provider_schedule.provider_id = providers.cognito_id
  and provider_schedule.date_from >= '2020-05-12T21:15:00+00:00'
  and provider_schedule.date_to <= '2020-05-12T21:30:00+00:00';

我在这里做错了什么不是供应商,其时间表可用性明显落在查询 window 时间之间?

你在范围内的条件是错误的。

示例中的 date_from 列包含小时 19:00。但是您的条件需要 date_from >= 21:15 - 显然不匹配,因为 19:00 不大于 21:15

你需要交换边缘:

SELECT pr.first_name, pr.last_name, ps.date_from, ps.date_to 
FROM app.provider_schedule ps
  JOIN app.providers pr ON ps.provider_id = pr.cognito_id
WHERE '2020-05-12T21:15:00+00:00' >= ps.date_from
  and '2020-05-12T21:30:00+00:00' <= ps.date_to;

也可以使用 timestamp range:

SELECT pr.first_name, pr.last_name, ps.date_from, ps.date_to 
FROM app.provider_schedule ps
  JOIN app.providers pr ON ps.provider_id = pr.cognito_id
WHERE tstzrange(ps.date_from, ps.date_to) @> tstzrange('2020-05-12T21:15:00+00:00', '2020-05-12T21:30:00+00:00');

@> 运算符表示 "does the left range contain the right range"