簡體   English   中英

在MySQL中檢查日期范圍

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

http://sqlfiddle.com/#!2/9e5f22

我認為您的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM