2015-11-02 125 views
0

定價之間SQL查詢來獲取每天每價格2個日期

enter image description here

我想要什麼,是爲了獲得price_per_day那些之間每天提供start_date &的end_date 2日期。

例如,如果我設定爲start_date = 2015-05-30 & end_date = 2015-06-02,所期望的輸出是

2015年5月30日| 24.00

2015-05-31 | 24.00

2015-06-01 | 27.00

2015-06-02 | 27.00

UPDATE:

即使這個輸出將是確定的,我

24.00

24.00

27.00

27.00

+2

所有日期的日曆表可能是有用的。 – jarlh

+0

@jarlh不幸的是,這不是我的選擇,我必須在現有的分貝工作。 – Makis

+0

然後,您必須生成一個「爆炸」日期範圍。如果你有一個數字表,你可以使用它,否則嘗試其中的一些技巧,如遞歸CTE或交叉連接系統表。一旦你得到了數字列表,你可以生成一個日期列表,並對其進行數學運算。 – Bridge

回答

0

你的要求應該是這個樣子:

SELECT Price FROM Pricing WHERE start_date = 2015-05-30 AND end_date = 2015-06-02 

但打印出來everydate日這兩個之間,我不知道。

這可以幫助你認爲:

How to list all dates between two dates

1

你必須選擇日期比「至」日期大於說,「從」日期和較小。我發佈了以下未經測試的內容,請在出現任何錯誤的情況下進行測試並通知我。

SELECT Price FROM Pricing WHERE start_date >= '2015-05-30' AND end_date <= '2015-06-02' 

編輯: 請確保起始日期日期和結束日期具有相同的類型提供的日期。爲了安全起見,您還可以將它們轉換爲日期時間或轉換(varchar,yourDatevariable,103),但您必須將其應用於條件的兩側。

0

你需要做的是有一個日期範圍(即每行日期1行)。這可以通過幾種方式完成。可能效率最高的是有一個日曆表,但是如果你不能添加不可能的新表。

你可以有一個數字表並將其添加到每行的開始日期,但這又需要一個新表。

這樣的選項是有一組聯合查詢來生成一個數字範圍。例如,下面將返回數字0到9的10行: -

SELECT 0 a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 

可以交叉連接彼此這樣子查詢,以產生更大範圍的數字,並添加到您的起始日期,其中結果小於等於結束日期: -

SELECT id, start_date, end_date, price_per_day, DATE_ADD(start_date, INTERVAL (units.a + tens.a * 10 + hundreds.a * 100) DAY) AS aDay 
FROM pricing 
CROSS JOIN (SELECT 0 a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units 
CROSS JOIN (SELECT 0 a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens 
CROSS JOIN (SELECT 0 a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) hundreds 
WHERE DATE_ADD(start_date, INTERVAL (units.a + tens.a * 10 + hundreds.a * 100) DAY) <= end_date 

以上將應付日期之間長達1000天。易於擴展以應付10000天以上,但會變得更慢。

檢查您感興趣的日期範圍時,您可以就用,作爲一個子查詢: -

SELECT aDay, price_per_day 
FROM 
(
    SELECT id, start_date, end_date, price_per_day, DATE_ADD(start_date, INTERVAL (units.a + tens.a * 10 + hundreds.a * 100) DAY) AS aDay 
    FROM pricing 
    CROSS JOIN (SELECT 0 a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units 
    CROSS JOIN (SELECT 0 a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens 
    CROSS JOIN (SELECT 0 a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) hundreds 
    WHERE DATE_ADD(start_date, INTERVAL (units.a + tens.a * 10 + hundreds.a * 100) DAY) <= end_date 
) sub0 
WHERE aDay BETWEEN '2015-05-30' AND '2015-06-02' 
ORDER BY aDay