2016-01-30 67 views
0

我正在爲預訂系統制定表格模式。預訂可以完成幾天或幾小時。查找日期範圍內每天有多少個單位可用

例如:100檯筆記本電腦可用,20人在不同日期租用35檯筆記本電腦。隨着不同的簽入和結帳時間。

我想根據顯示每天有多少單位的結果生成預訂日曆。

我正在嘗試生成顯示日期範圍(如2016-01-01 10:30至2016-01-04 10:30)的單位計數的結果。

Date  | availableUnits 
2016-01-01 | 10 
2016-01-02 | 6 
2016-01-03 | 0 
2016-01-04 | 11 

廣告的表

id | title    | unit 
142 | HP Laptop   | 100 
143 | Apple MacBook Air | 25 

表預訂

id | ad_id | start_date   | end_date    | units 
5 | 143 | 2015-08-17 18:18:00 | 2015-08-24 18:18:00 | 5 
8 | 142 | 2015-08-20 05:30:00 | 2015-08-31 05:30:00 | 2 
1 | 143 | 2015-08-20 16:59:00 | 2015-08-25 16:58:00 | 1 
6 | 142 | 2015-08-25 20:37:00 | 2015-08-29 20:37:00 | 1 
10 | 142 | 2015-08-27 05:30:00 | 2015-08-29 04:30:00 | 1 
11 | 143 | 2015-09-01 05:30:00 | 2015-09-05 05:30:00 | 3 
4 | 142 | 2015-09-01 17:20:00 | 2015-10-12 17:20:00 | 2 
3 | 143 | 2015-09-01 21:28:00 | 2015-09-30 21:28:00 | 5 
19 | 143 | 2015-09-03 05:30:00 | 2015-09-26 05:30:00 | 1 
12 | 142 | 2015-09-05 05:30:00 | 2015-09-10 05:30:00 | 1 

我創建了一個SQL小提琴,如果有人想運行的查詢。 SQL fiddle

我嘗試了幾種不同的方法,但沒有取得太大的成功。爲每一天存儲可用性是一種選擇。但是,當廣告數量增加時,這可能是一個大問題。即使少量的廣告可以生成大量的數據,如果我這樣做。

任何建議是welocme

+0

你用什麼時間作爲採樣點來獲取可用單元的數量?你說*如2016-01-01 10:30到2016-01-04 10:30 *所以取決於用戶輸入和類似* 2016-01-01 10:30到2016-01-04 12: 30 *將無效? –

+0

@FrederickZhang是的,這將是有效的。用戶可以選擇任何日期範圍。 –

回答

0

訣竅是使用每個記錄,彷彿那裏有2條記錄。

在一個預定的開始日期,這對你的股票

SELECT b1.start_date at_date, -b1.units unitsDiff 
FROM ad_bookings b1 

產生負面影響。在一個預定的結束日期,你的股票又增加

SELECT b2.end_date at_date, b2.units unitsDiff 
FROM ad_bookings b2 

如果你想知道在特定時間有多少個單元可用,可以將這兩個查詢合併爲一個排序順序:

-- availability at specific moment 
SELECT grouped.at_date, 
    @sum := COALESCE(@sum,(SELECT unit FROM ads WHERE id = 142)) + grouped.unitsDiff CurrentTotal, grouped.unitsDiff 
FROM (
    SELECT sub.at_date, sum(sub.unitsDiff) unitsDiff 
    FROM (
     SELECT b1.start_date at_date, -b1.units unitsDiff 
     FROM ad_bookings b1 
     WHERE b1.ad_id = 142 
     UNION 
     SELECT b2.end_date at_date, b2.units unitsDiff 
     FROM ad_bookings b2 
     WHERE b2.ad_id = 142 
) sub 
    GROUP BY sub.at_date 
) grouped 
ORDER BY grouped.at_date 
  • 如果您想對特定範圍執行此操作,您只需要那些以任何方式與該範圍重疊的ad_bookings

  • 如果你想消除時間,並有特定的日期,你可以投你的開始和結束日期。 CAST(b1.start_date AS DATE) at_date。 (您可能希望小區的END_DATE和地板的起始日期)

  • 如果明確地需要在範圍內的所有日期,您可以添加像UNION '2015-10-22' at_date, 0 unitsDiff

  • 僞記錄我建議你查詢需要ad_bookings(也許分組)並讓應用程序邏輯處理它。但這取決於你。

相關問題