[英]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.