gpt4 book ai didi

php - 预订系统-可用表

转载 作者:行者123 更新时间:2023-11-29 00:36:08 26 4
gpt4 key购买 nike

我已经做了几天了,我想不出来。
我希望你能帮我。
我在做预订系统,我想查一下日期和时间是否有空位。
这就是我的数据库的样子。
我想把可用的表格放入一个选择下拉菜单,所以在网站上它只显示可用的表格。
如果我使用以下查询,我可以获取重新服务器的表

SELECT res.reserveringsnr, datum, begintijd, eindtijd, tafr.tafelnr FROM reserveringen AS res
INNER JOIN tafels_regel AS tafr
ON res.reserveringsnr = tafr.reserveringsnr
WHERE (res.datum = "2013/12/18" AND (res.begintijd BETWEEN "12:00:00" and "14:00:00"))

所以这个查询输出在reserverd表中,但这里是我遇到的问题。
我不知道如何检查某个表是否在日期和时间上重新服务器。
(注意:日期和时间将由一个变量填充,但对于我使用的示例,只使用文本)
编辑:正在研究@sebt他的解决方案
首先,回答你的问题
预订总是在同一天
预约有固定的时间,总是2小时。
我将sebt的查询编辑为我的值:
    SELECT t.* FROM
tafels t
LEFT JOIN
(SELECT tafelnr FROM
tafels_regel tf
INNER JOIN
reserveringen res
ON tf.reserveringsnr=res.reserveringsnr
WHERE
res.datum="2012/01/12" AND
res.begintijd<"19:00:00" AND
res.eindtijd>"21:00:00"
)
ReservationsAtThisTime
ON t.tafelnr=ReservationsAtThisTime.tafelnr
WHERE ReservationsAtThisTime.tafelnr IS NULL

此查询输出的结果如下
如您所见,查询结果显示所有tafel(12)。
我还将reservering、tafels_regel和tafels表导出为.csv(请参见下面编辑的.csv)
编辑2:
好吧,我又编辑了我的查询,它对一个部分有效。
这是查询( Screenshot
    SELECT t.* FROM
tafels t
LEFT JOIN
(SELECT tafelnr FROM
tafels_regel tf
INNER JOIN
reserveringen res
ON tf.reserveringsnr=res.reserveringsnr
WHERE
res.datum="2013/01/12" AND
res.begintijd <= "19:00:00" AND
res.eindtijd >= "21:00:00"
)
ReservationsAtThisTime
ON t.tafelnr=ReservationsAtThisTime.tafelnr
WHERE ReservationsAtThisTime.tafelnr IS NULL

2013/01/12有两个预订。( Download编辑.csv)
预订1:tafel 1 19:00至21:00
预订2:20:00至22:00,tafel 11和tafel 12
当我运行上面的查询时,唯一没有显示的tafel是tafel 1,因为tafel 1是从19:00到21:00重新服务器的。但是,从20:00到22:00 tafel 11和12也被保留。
正如您在查询结果中看到的,只有tafel 1被重新服务器。
但是当我从19:00到21:00再做一次服务器更新,我检查可用的tafel时,tafel 11和tafel 12仍然显示。
塔菲尔酒店19点有空,是的,但是因为我们总是坐2个小时,所以不能坐在那里。
再次感谢@sebt的输入,希望您能进一步帮助我查询!
问题解决了
谢谢你的帮助,这是最后一个问题
SELECT t.* FROM
tafels t
LEFT JOIN
(SELECT tafelnr FROM
tafels_regel tf
INNER JOIN
reserveringen res
ON tf.reserveringsnr=res.reserveringsnr
WHERE
res.datum="2013/01/12" AND
res.eindtijd > "19:00:00" AND
res.begintijd < "21:00:00"
)
ReservationsAtThisTime
ON t.tafelnr=ReservationsAtThisTime.tafelnr
WHERE ReservationsAtThisTime.tafelnr IS NULL

最佳答案

我认为您的问题措辞有点混乱,因为SQL“Tables”(数据库表)和数据库中的一个对象(我猜是一个餐厅表,荷兰语称为“tafel”)之间的模糊性?
(让我们继续称它们为“tafel”,因为这消除了模糊性)
要仅选择未保留的tafels,您可以将所有tafels加入到[所需时间]当前的保留集合中,并仅返回没有保留的tafels:

SELECT t.* FROM
Tafels t
LEFT JOIN
(SELECT tafelnr FROM
Tafels_regel tf
INNER JOIN
Reserveringen res
ON tf.reserveringnr=res.reserveringnr
WHERE
res.Datum=[desired date] AND
res.begintijd<[desired time] AND
res.eindtijd>[desired time]
) ReservationsAtThisTime
ON t.tafelnr=ReservationsAtThisTIme.tafelnr
WHERE ReservationsAtThisTime.tafelNR IS NULL

这可能还需要一些调整,例如:
跨越数天的预订(即从一天开始到另一天结束)不会得到妥善处理。(但也许你不需要这个)
一张桌子会显示为10/01/2012 12:30,而实际上是从10/01/2012 12:45开始预订的(也许没有人对至少X分钟-1小时不免费的桌子感兴趣?-在他们期望的开始时间之后?).
编辑(回答以下OP的评论):
查看您的数据,我可以看到您已于2013年1月12日19:00至21:00预订了Tafel 1。我可以理解为什么你没有得到预期的结果(即塔菲尔1不应该显示,因为它不是免费的):
您在查询中使用的日期是2012年,而不是2013年。(这可能源于我的例子,我使用2012)
我设计了一个例子来使用一个时间点“期望时间”。我的想法是“期望时间”是一个点(例如19:30),因此从19:00开始到20:00结束的预订将使这个期望时间不可用。因为您使用的“所需时间”是一个范围(19:00到21:00),而且它恰好与预订的范围完全相同,所以查询中的“<”和“>”无法提取此预订,因为它与“所需时间”相冲突(相反,“<=”和“>=”将修复此问题)。
但是,由于您说过所有预订都是2小时,因此仅使用所需的开始时间就可以更容易地指定“冲突预订”,如下所示:“冲突预订”是指在所需的开始时间之后的2小时内占用任何时间的预订:
a.res.Datum=[期望日期];以及
b.res.eindtijd>[期望开始时间];和
c.res.begintijd<[期望开始时间+2小时]
我不完全确定代码如何完成2小时的添加(我的专长是MS-SQL而不是MySQL,日期/时间操作可能有点特定于SQL版本)。
EDIT2(回答OP的重拨问题):
为了有助于说明问题,我将定义以下术语:
现有预订:已经存在于数据库中。有TafelNr、Date、StartTime(begintijd)和EndTime(eindtijd)
建议的预订:用户想做的一个——当然它在数据库中还不存在,或者有一个TaFelnr。有约会,开始时间,结束时间。
(对于建议的预订,您已经使用StartTime和EndTime实现了查询。我建议只使用StartTime,然后使用[StartTime+2小时]。但你用哪种方法对我们所讨论的问题没有影响)
如果查询工作正常,则不应显示tafels 11和12。您建议的预订从19:00到21:00应该与20:00到22:00之间的现有预订发生冲突。但正如你所发现的,这个冲突并没有被检测到。
原因是你的开始/结束时间比较有点错误。你编码的方式:
res.begintijd <= [Proposed Start time] AND
res.eindtijd >= [Proposed End time]

如果现有的预订跨越了拟议的预订,只会在同一时间填写,或者在预订之前和/或之后延长。
想象一下这两个预订(现有的和提议的)就像平行的乐高块沿着相邻的线路滑动是有帮助的。他们可以完全不接触(好);或者只是接触(一方的结束=另一方的开始:好,没有冲突-只是!);或者一个的结束可以延伸到另一个的开始(冲突);或者一个可以跨越另一个,开始于另一个的同时或之前,结束于另一个的同时或之后(冲突)。
这是我多年前在预订系统工作时想出的一个窍门。要找到冲突,正确的比较(如我在上面的上一次编辑中所做的)是:
ExistingBookingEndTime>ProposedBookingStartTime AND
ExistingBOokingStartTime<ProposedBookingEndTime

或者,使用对象名称:
res.eindtijd>"19:00:00" AND
res.begintijd<"21:00:00"

一开始这可能没有意义,但如果你想想乐高积木,它会有意义的。
注意:
一。我使用的是<和>,而不是<=和>=,因为我假设只要预订不重叠,它们可以相互延伸并“接触”;
2。在比较日期和时间时要小心——它可能会给出奇怪的结果,就好像它们是数字或字符串一样。我不知道MySQL是如何处理这个问题的,但我总是很小心/偏执。

关于php - 预订系统-可用表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14235878/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com