2012-06-23 27 views
0

我有以下表格,其中包含定義每個期間預訂價格的時間段;SELECT返回總預訂價格

ID, STARTDATE, ENDDATE, PRICE 
6, 2012-06-01, 2012-06-30, 20 
7, 2012-07-01, 2012-07-31, 35 
8, 2012-08-01, 2012-08-31, 30 
9, 2012-09-01, 2012-09-30, 25 

此表定義定價期(開始和定價時段與預定的價格爲每一天在那個特定的定價時段的結束日期)。問題是如何創建一個查詢,它將在某個給定的預訂期內返回所有天數的預訂總價格?例如,如何計算(SELECT?)2012-06-10至2012-08-20期間的總(SUM)預訂價格? (當然可以手動計算= 21(6月的天數)x20 + 31(7月的天數)x35 + 20(8月的天數)x30 = 2105)返回總預訂價格的SELECT語句應該如何顯示喜歡?

回答

1

使用DATEDIFF功能:

SELECT SUM(DATEDIFF(ENDDATE,STARTDATE) * PRICE) AS TOTAL_PRICE 
    FROM SEASONS 
    WHERE STARTDATE <= '2012-06-10' AND ENDDATE >= '2012-08-20' 

另外,我們可以/添加一個檢查預約開始結束,因爲他們在中間的某個地方落下,你並不需要包括所有的時期...

所以:

SET @START='2012-06-10'; 
SET @END='2012-08-20'; 
SELECT SUM(
    DATEDIFF(
    IF(YEAR(ENDDATE)=YEAR(@END) AND MONTH(ENDDATE)=MONTH(@END), @END, ENDDATE), 
    IF(YEAR(STARTDATE)=YEAR(@START) AND MONTH(STARTDATE)=MONTH(@START), @START, STARTDATE) 
    ) 
) AS TOTAL_SUM 
FROM SEASONS 
WHERE STARTDATE <= @END AND ENDDATE >= @START 
+0

偉大的答案'SET @ START ='2012-06-10'; SET @ END ='2012-08-20'; (年)(ENDdate)= YEAR(@END)AND MONTH(enddate)= MONTH(@END),@END,enddate), 如果(年份(startdate)= YEAR(@ START)和MONTH(startdate)= MONTH(@START),@ START,startdate) )+1)* price )AS TOTAL_SUM FROM seasons WHERE startdate <= @ENDEND enddate> = @ START – sbrbot

0

只是爲了其他讀者,從前面的回答結果最終的查詢是:

SET @START='2012-06-10'; 
SET @END='2012-08-20'; 
SELECT SUM(
(DATEDIFF(
    IF(enddate>[email protected],@END,enddate),  
    IF(startdate<[email protected],@START,startdate) 
)+1)*price) AS TOTAL_SUM 
FROM seasons WHERE startdate<[email protected] AND enddate>[email protected] 

1應該添加到日期差異,以便將起始和結束日期包括在定價範圍內,當然,它應該與價格相乘。

@poncha非常感謝你,我已經創建了通過預訂期間的所有日期讀取多的價格,合計起來作爲一個解決方案循環的過程,但我知道應該有一個更簡單,更高效的解決方案