可能重複:
Calculating total quantity of equipments for a date range如何薩姆在給定日期設備的總量在
項目:我工作的一個項目,該項目是關於使用在一些房間和設備客房。該軟件是關於調度房間中的設備的。換句話說,它是一種預訂軟件,用於在需要的日期和時間範圍內爲單獨的房間預留選定的設備。 MYsSQL數據庫中有許多表與Php一起工作,但我會提及我的問題所關注的表。與我的問題相關的表格是設備表(表A),時間表(表B)和相關時間表(表C)中使用的設備。
表A:設備列表表格
+------+----------+-----------+
| eqid | eqName | available |
+------+----------+-----------+
| 1 | book | 90 |
| 2 | pen | 82 |
| 3 | computer | 25 |
+------+----------+-----------+
在表A; eqid代表設備的唯一ID,eqName代表設備的名稱,available代表現有的可用設備總數。
表B:調度表
+------------+------------+------------+-----------+----------+--------+
| scheduleid | startDate | endDate | startTime | endTime | office |
+------------+------------+------------+-----------+----------+--------+
| 1 | 2012-08-27 | 2012-08-27 | 08:30:00 | 10:00:00 | room1 |
| 2 | 2012-08-27 | 2012-08-27 | 09:30:00 | 11:00:00 | room3 |
| 3 | 2012-08-28 | 2012-08-30 | 08:30:00 | 12:00:00 | room2 |
| 4 | 2012-08-29 | 2012-08-31 | 11:30:00 | 14:00:00 | room1 |
| 5 | 2012-08-28 | 2012-08-28 | 10:30:00 | 14:00:00 | room3 |
| 6 | 2012-08-27 | 2012-08-30 | 08:30:00 | 10:00:00 | room4 |
| 7 | 2012-08-27 | 2012-08-27 | 10:30:00 | 12:00:00 | room4 |
| 8 | 2012-08-27 | 2012-08-30 | 08:30:00 | 11:00:00 | room6 |
| 9 | 2012-08-27 | 2012-08-27 | 10:30:00 | 12:00:00 | room5 |
+------------+------------+------------+-----------+----------+--------+
在表B; scheduleid表示日程安排的唯一ID,startDate和endDate是計劃的日期範圍,計劃的startTime和endTime時間範圍,辦公室表示計劃的執行時間。讓我舉一個例子。 Scheduleid 1表示2012年8月27日星期一有保留,從08:30到10:00。當它在同一天開始和結束時,這只是在room1中的一天預訂。但是,Scheduleid 3意味着預訂將於2012年8月28日星期二開始,直到2012年8月30日,星期四08:30至12:00爲止,換句話說,它會持續3天,每天從08:30至12:00 ...因此,週二至週四08:30至12:00在房間2預訂...我希望這是明確的。
表C:使用在相關時間表
+--------+------------+------+-------------+
| Autoid | scheduleid | eqid | amountInSch |
+--------+------------+------+-------------+
| 1 | 1 | 1 | 2 |
| 2 | 1 | 2 | 3 |
| 3 | 1 | 3 | 1 |
| 4 | 2 | 1 | 1 |
| 5 | 2 | 2 | 1 |
| 6 | 2 | 3 | 2 |
| 7 | 3 | 2 | 1 |
| 8 | 3 | 3 | 3 |
| 9 | 4 | 2 | 1 |
| 10 | 4 | 3 | 1 |
| 11 | 5 | 1 | 1 |
| 12 | 6 | 1 | 1 |
| 13 | 6 | 3 | 2 |
| 14 | 6 | 2 | 4 |
| 15 | 7 | 1 | 5 |
| 16 | 7 | 2 | 6 |
| 17 | 8 | 2 | 1 |
| 18 | 9 | 1 | 8 |
| 19 | 9 | 2 | 5 |
| 20 | 9 | 3 | 6 |
+--------+------------+------+-------------+
在表C中的設備:自動識別表示由自動遞增生成獨特的自動ID,scheduleid來自表B,eqid來自表A,amountInSch表示如何許多(數量)設備將在相關的時間表中使用。我想在這裏舉一個例子。表C中的Scheduleid 1有3行。這意味着TAble B相關的scheduleid 1將在表B的room1指定日期和時間使用2本書(eqid 1),3筆(eqid 2)和1臺計算機(eqid 3)。另一個例子是表C中的scheduleid 3與2行相關。這意味着每天從08:30至12:00每天將在2012年8月27日至30日的2號房間使用1支(eqId 2)和3套電腦(eqId 3)。
以上是對該項目的解釋和一些信息。表格行不是永久的。當你預約,將有表B中的新行,如果它被選中的設備,就會出現在表C中新的行...
問題:
我想計算左當我提供eqId,startDate,endDate,startTime和endTime時特定設備的數量......
一個例子:
eqId:1(書)
開始日期:2012年8月27日
結束日期:2012年8月27日
開始時間:8時30分00秒
結束時間:12:00:00
結果應該是:在血清膽鹼酯酶用14本書由於:如果你看scheduleIds和相關的eqIds,你只會看到與我的查詢(日期和eqId)相關的1,2,6,7,9個scheduleIds。如果你總結表C中的所有相關數量,你將得到錯誤的結果。換句話說,eqId(1-book)和1,2,6,7,9時間表的相關數量分別是2,1,1,5,8。所以如果你總結他們,你會得到17這是錯誤的。因爲1和9時間表在開始和結束時間方面並不相互交叉,6和7也不相互交叉。由於他們2留下孤獨,可以分開計數。因爲8大於2,所以我們必須考慮1和9的總和8.因爲8和6都是相同的,所以5被認爲是5因爲大於1 ...
所以人們!我不確定我如何在編程算法中總結這一點。有沒有辦法在SQL中做或我必須一起使用PHP和Mysql?如何?
沒有提出一個想法(對此感到遺憾)......使用DATETIME列而不是DATE和TIME列不會更容易嗎?然後:如果一個時間表是從9:00到10:00,而另一個是從10:00到11:00,那麼如果一個設備不在同一個房間,那麼可以使用一個設備是兩個時間表?您將不得不將它們從X傳輸到Y,這通常需要一些時間。所以也許「不相交」在這裏不夠強大。 – Jens
@Jens可以將設備從一個房間搬到另一個房間。時間表之間會有中斷。這是開始像這樣的日期和時間字段,所以現在很難改變它... – deepnote