2013-03-26 49 views
1

我有一張發票表,用於存儲給定數據範圍(即2012-01-01至2012-01-31之間日期的發票1)的發票。現在,可以對一些天,沒有相關的發票,所以你必須填寫Mysql中數據範圍之間的差距

> ID | START_DATE | END_DATE 
> ---------------------------- 
> 1 | 2012-01-01 | 2012-01-31 
> 2 | 2012-02-05 | 2012-02-28 

因此,在這種情況下,從2月5日將不會有與之關聯的發票。現在我想估計成本,所以我需要以某種方式「獲得」這些缺失的數據範圍。

我看到過幾個類似問題的答案,但其中大多數依賴於我無法創建的額外日曆表。

有沒有其他的SQL解決方案,或者它會更好地實際獲得發票,然後計算我的應用程序中的差距?

回答

0

如果數據集沒有重疊的日期,一個解決方案是使用這樣的查詢,提取所有丟失的範圍:

select 
    r1.END_DATE + INTERVAL 1 DAY d1, MIN(r2.START_DATE) - INTERVAL 1 DAY d2 
from 
    ranges r1 INNER JOIN ranges r2 
    ON r1.END_DATE <= r2.START_DATE 
group by 
    r1.END_DATE 
having 
    DATEDIFF(MIN(r2.START_DATE), r1.END_DATE) > 1 

請參閱小提琴here

+0

做到了,謝謝! – MichelReap 2013-03-26 09:20:41

+0

我知道這不是問題的一部分,但對於未來的讀者來說,如果數據集具有重疊日期,則這不起作用。見[這個小提琴](http://sqlfiddle.com/#!2/4ddcf/1)我在2012-03-17中添加了「2012-03-14」範圍,並且錯誤地將第18個第20排作爲第5排與第16到第19排除的差距被覆蓋。 – Turnerj 2016-01-02 10:43:09

+1

@Turnerj謝謝你的評論,你是對的,我將不得不更新我的答案,更好地指定它不會工作,如果數據集具有重疊的日期 – fthiella 2016-01-02 10:48:15