[英]Checking for date range in MySQL
我正在为一家美容院预订系统。 我有以下表格:
提供者-沙龙的工人。
TABLE `providers` (
`providerId` int(11) NOT NULL AUTO_INCREMENT,
`providerName` varchar(150) NOT NULL DEFAULT '',
PRIMARY KEY (`providerId`)
)
101 Anna
102 Beata
服务-他们提供的不同服务
TABLE `services` (
`serviceId` int(11) NOT NULL AUTO_INCREMENT,
`service` varchar(150) NOT NULL DEFAULT '',
`serviceDuration` int(11) NOT NULL,
`providerId` int(11) NOT NULL,
PRIMARY KEY (`serviceId`)
)
1 Hair cut 30 101
2 Hair coloring 120 101
时间表-有关每个提供商何时提供不同服务的表格
TABLE `schedule` (
`scheduleId` int(11) NOT NULL AUTO_INCREMENT,
`serviceId` int(11) NOT NULL,
`providerId` int(11) NOT NULL,
`scheduleStartDateTime` datetime NOT NULL,
`scheduleEndDateTime` datetime NOT NULL,
PRIMARY KEY (`scheduleId`)
)
1 1 101 2014-10-17 10:00:00 2014-10-17 10:29:59
2 1 101 2014-10-17 10:30:00 2014-10-17 10:59:59
3 1 101 2014-10-17 11:00:00 2014-10-17 11:29:59
4 1 101 2014-10-17 11:30:00 2014-10-17 11:59:59
5 1 101 2014-10-17 12:00:00 2014-10-17 12:29:59
6 2 101 2014-10-17 10:30:00 2014-10-17 12:29:59
最后,是“预订”-预订服务的表格。
TABLE `bookings` (
`bookingId` int(11) unsigned NOT NULL AUTO_INCREMENT,
`clientId` int(11) NOT NULL,
`bookingDate` datetime NOT NULL,
`serviceId` int(11) NOT NULL,
`providerId` int(11) DEFAULT NULL,
`startDateTime` datetime NOT NULL,
`endDateTime` datetime NOT NULL,
PRIMARY KEY (`bookingId`)
)
1 1 2014-10-16 1 101 2014-10-17 10:30:00 2014-10-17 10:59:59
当然,还有更多的客户,付款等表格已加入搜索。
我的问题是搜索以查找每个提供商的未预订的可用服务。
假设有人想要安娜剪头发。 然后,我想介绍可用于剪发的预定时间,但不包括10:30:00已预定的时间。
select s.serviceId, s.providerId, s.scheduleStartDateTime, s.scheduleEndDateTime
FROM schedule AS s
WHERE s.serviceId = '1'
AND s.providerId NOT IN
(
SELECT providerId
FROM bookings
WHERE startDateTime <= s.scheduleEndDateTime
AND endDateTime >= s.scheduleStartDateTime
)
但是此搜索给出以下结果:
1 101 2014-10-17 10:00:00 2014-10-17 10:29:59
1 101 2014-10-17 10:30:00 2014-10-17 10:59:59 <-- This should not show up
1 101 2014-10-17 11:00:00 2014-10-17 11:29:59
1 101 2014-10-17 11:30:00 2014-10-17 11:59:59
1 101 2014-10-17 12:00:00 2014-10-17 12:29:59
我认为您的SQL应该是这样的:
select s.serviceId, s.providerId, s.scheduleStartDateTime, s.scheduleEndDateTime FROM schedule AS s WHERE s.serviceId = '1' AND s.providerId NOT IN ( SELECT b.providerId FROM bookings AS b WHERE b.startDateTime >= s.scheduleEndDateTime AND b.endDateTime <= s.scheduleStartDateTime )
子查询应选择已预订的,因此主查询将排除已预订的那些。
阿纳斯
时间表对我来说似乎很奇怪。 您是否打算每天在计划表中预生成行? 如果是这样,那么预订表将只需要存储预订的时隙的时间表ID,但是由于服务的长度不一样而变得更加困难。
进度表概念似乎可以简化。 您需要知道每个提供者的开始和结束时间。 然后,您可以在特定的开始时间安排服务,持续时间为30分钟或120分钟。 开始时间和持续时间阻碍了提供商的日程安排。
当客户想要创建预订时,他们可以从可用的开始时间(每30分钟)中选择一个足够长的时间(即提供商计划中的空缺时间)。 搜索查询可以检索现有的预订,然后可以在显示侧限制客户的选择。
我在sqlfiddle中得到了正确的答案(更改了我在预订表中输入的错误日期之后)。 我在原始表中有相同的错误。 问题解决了!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.