2013-08-01 348 views
1

我與日期範圍表由兩個字段(開頭和結尾)綁定工作:SQL日期範圍查詢

ID | START  | END 
1  2010-01-01 2010-07-01 
2  2011-01-01 2011-07-01 
3  2012-01-01 2013-07-01 
4  2013-01-01 2013-07-01 
5  2009-01-01 2013-07-01 

我能得到的所有範圍爲代表的「月」數量的粗略估計通過類似的查詢:

SELECT SUM(DATEDIFF(dy, Start, End)/30) as Total_Months 
FROM TABLE 

我寧願喜歡做的事情就是查詢多少個月(或天數)由給定的時間內所有範圍表示。

所以如果我問上面的例子中從時間段[2013-01-01 - 2013-07-01]表示有多少個月,它將表示18(每行3,4和5有6個)。

完成此操作的最佳方法是什麼?

+0

你想如何計算幾個月?例如,「2013-01-14 - 2013-02-13」一個月? '2013-01-31 - 2013-03-01'兩個月嗎?或者我們可以假設'START'和'END'包含每個月的第一個? – PoByBolek

+0

我想將一個月計爲月= 30天。 – user1893148

+0

我想要整個表格的結果,就像在我的SUM(DATEDIFF)例子中一樣。 – user1893148

回答

1

更新:你可以像下面這樣做

SELECT SUM(DATEDIFF(dy, 
        CASE WHEN '2013-01-01' > Start THEN '2013-01-01' ELSE Start END, 
        CASE WHEN '2013-07-01' < [End] THEN '2013-07-01' ELSE [End] END)/30) Total_Months 
    FROM Table1 
WHERE '2013-01-01' BETWEEN Start AND [End] 
    AND '2013-07-01' BETWEEN Start AND [End] 

輸出:

 
| TOTAL_MONTHS | 
---------------- 
|   18 | 

這裏是SQLFiddle demo

+0

謝謝,但這也不能解決問題。我認爲我給出的例子,5行,範圍和答案(18個月)很好地描述了我的問題。在你提供的SQLFiddle演示中,總的月數= 24。 – user1893148

+0

對不起,我起初誤解了你的需求。請參閱更新的答案和sqlfiddle示例。 – peterm

+0

我認爲案件可能會在結束日期之間切換(這不會影響我的例子),但這是完美的,謝謝。 – user1893148

0

這樣的事情?

SELECT SUM(DATEDIFF(dy, Start, End)/30) as Total_Months 
WHERE Start >= '2013-01-01' AND End <= '2013-07-01' 
FROM TABLE 

或者使其參數:

SELECT SUM(DATEDIFF(dy, Start, End)/30) as Total_Months 
WHERE Start >= @startDate AND End <= @endDate 
FROM TABLE 
+0

謝謝,但是這會告訴我與給定時間段重疊的範圍內的總月數,但是我想排除不在所選時間段內的範圍部分。 – user1893148