如何在 PostgreSQL 中过滤预订约会之间的可用时间段?

问题描述 投票:0回答:1

我正在尝试为牙医诊所实施预约经理。

问题是我不确定如何正确实现这样的功能。现在我已经成功创建了这两个表来处理它:

CREATE TABLE Horarios (
    id_horario BIGSERIAL PRIMARY KEY,
    hora TIME UNIQUE NOT NULL
);

CREATE TABLE Consultas (
    id_consulta BIGSERIAL PRIMARY KEY,
    paciente INTEGER REFERENCES Pacientes(id_paciente),
    creado_por INTEGER REFERENCES Administrativo(id_administrativo),
    fecha_designada DATE NOT NULL,
    consulta_completa BOOLEAN DEFAULT false,
    hora_inic INTEGER REFERENCES Horarios(id_horario),
    hora_fin INTEGER REFERENCES Horarios(id_horario),
    dentista INTEGER REFERENCES Dentistas(id_dentista)
);

所有小时时间戳都是硬编码值,例如(“07:00”) 到目前为止,一切都很好,我一直在使用此查询来获取所有可用的约会:

SELECT
    h.id_horario,
    h.hora 
FROM 
    Horarios h
WHERE
    NOT EXISTS (
        SELECT 1
        FROM Consultas c
        WHERE
            c.fecha_designada = $1
            AND c.dentista = $2
            AND h.hora >= (SELECT hora FROM Horarios WHERE id_horario = c.hora_inic)
            AND h.hora < (SELECT hora FROM Horarios WHERE id_horario = c.hora_fin)
    )
ORDER BY
    h.hora;

它将检查所述约会的开始时间(hora_inic)和结束时间(hora_fin)之间的所有时间戳。

当您必须提前创建约会时,它非常有用。 但当你必须创造时,可以说:

一个从 7:00 到 7:30 的约会,然后另一个从 8:00 到 8:30 的约会,它不允许我创建从 7:30 到 8:00 的约会。

这显然是一个逻辑错误。 我一直在尝试更改我的查询以及我的后端和前端。为了缓解这个问题。但我相信这只是我的设计不当。

我可以使用一些指导或建议来解决此问题或如何创建约会应用程序。因为这就是现在给我带来问题的部分。

感谢您花时间阅读我的帖子。谢谢!

sql database postgresql
1个回答
0
投票

从心里检查代码,似乎没有什么问题。我需要运行一些示例查询来查看内部查询返回的内容以进行调试。不要执行“SELECT 1”,执行“SELECT *”并将 h.hora 值替换为“7:30”。

但是...

创建一个表格来定义工作时间的选择让我觉得很奇怪。您不需要一天中存在哪些时间的列表。您知道他们可以从 00:00 到 23:59;您不需要验证这些值。

不仅仅是掌握“时间”,通常的方法是拥有一张“时段”表(可能是免费的或保留的)。每个时段都有自己固定的开始和结束时间。主要缺点是,如果预约的期限不同,那么灵活性就会受到限制;您可以通过对多个槽进行分组(通过业务逻辑或创建 1-N“约会”类)来解决此问题。另外,您需要一个程序来定期生成插槽。

好处很多:

  • 免费插槽的查询(这是您最常运行的查询之一)变得更加容易和快捷。
  • 你有灵活性。如果您想更改工作时间,只需以不同的方式生成时段即可。如果您不想再在 8:00 安排预约,您当前的模型会发生什么情况?您无法删除 8:00 记录,因为您之前有很多约会引用了它。
© www.soinside.com 2019 - 2024. All rights reserved.