2013-08-01 77 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