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"
我有一个简单的时间表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"