我正在尝试为牙医诊所实施预约经理。
问题是我不确定如何正确实现这样的功能。现在我已经成功创建了这两个表来处理它:
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 的约会。
这显然是一个逻辑错误。 我一直在尝试更改我的查询以及我的后端和前端。为了缓解这个问题。但我相信这只是我的设计不当。
我可以使用一些指导或建议来解决此问题或如何创建约会应用程序。因为这就是现在给我带来问题的部分。
感谢您花时间阅读我的帖子。谢谢!
从心里检查代码,似乎没有什么问题。我需要运行一些示例查询来查看内部查询返回的内容以进行调试。不要执行“SELECT 1”,执行“SELECT *”并将 h.hora 值替换为“7:30”。
但是...
创建一个表格来定义工作时间的选择让我觉得很奇怪。您不需要一天中存在哪些时间的列表。您知道他们可以从 00:00 到 23:59;您不需要验证这些值。
不仅仅是掌握“时间”,通常的方法是拥有一张“时段”表(可能是免费的或保留的)。每个时段都有自己固定的开始和结束时间。主要缺点是,如果预约的期限不同,那么灵活性就会受到限制;您可以通过对多个槽进行分组(通过业务逻辑或创建 1-N“约会”类)来解决此问题。另外,您需要一个程序来定期生成插槽。
好处很多: