2012-01-13 40 views
0

我有这个表选择日期路口

+------+--------+-------------------------+ 
| id | amount | start_date | end_date | 
| 10 |  10 | 2012-01-15 | 2012-01-20 | 
| 10 |  12 | 2012-01-14 | 2012-01-15 | 
| 10 |  22 | 2012-01-15 | 2012-01-16 | 
+------+--------+-------------------------+ 

我会想找到一个给定的区间的总和。

实施例:

开始日期:2012-01-13
结束日期:2012-01-18
总和(量)= 44

开始日期:2012-01- 18
结束日期:2012-01-21
总和(量)= 10

是,可能使用单个查询?
这是可能的吗?

EDIT
背后的逻辑是,如果intevarls(给定的一个和在表内)重叠,我应该得到的行。

+0

任何事情都可能,如果你相信!其实,你能否在这里详细介绍一下?像你这样的请求_sounds_要去_inclusive_集合,但是这些例子显示了其他情况。 – 2012-01-13 14:05:17

+0

谁低估了,为什么?没有评论为什么,你期望达到什么目的? – MatBailie 2012-01-13 14:29:30

+0

@Dems感谢upvote:P – tampe125 2012-01-13 14:40:10

回答

3
SELECT SUM(amount) 
FROM TableX 
WHERE start_date <= @EndDate 
    AND @StartDate <= end_date 

其中@StartDate@EndDate你想与检查的日期。

+1

+1:这是绝对正确的。但我会添加一些额外的东西。如果你有'start_date,end_date'的索引,你实际上只能从'start_date'部分受益。并且,您只需指定'start_date <= @ endDate'。如果您知道表中存在的最长时间段,则可以添加'AND start_date> = @startDate - (longestPeriod)'。在大型数据集中,这可以大量减少正在检查的记录数。这导致我在这种类型的模式中执行最大持续时间,然后有多个记录来表示较长的时间段。 – MatBailie 2012-01-13 14:28:51

+0

我已经尝试过这个解决方案,它没有工作..你知道为什么吗?我忘了报价日期!我笨...... :) – tampe125 2012-01-13 14:39:34

+0

@Dems:不错。这种两种(或更多)的范围条件始终难以优化。我想加入AND(@ StartDate-longestPeriod)<= end_date'也可能有帮助。 – 2012-01-14 07:55:54

0

SELECT SUM(额),表,其中起始日期> '2012-01-13' 日期和结束日期< '2012-01-18'

0

当然,你可以这样做:

select sum(amount) from my_dates where start_date >= '2012-01-13' and end_date <= '2012-01-18' 

给你34.如果你想获得44你会怎么做:

select sum(amount) from my_dates where start_date >= '2012-01-13' and end_date <= '2012-01-20' 

希望这有助于

0
SELECT SUM(`amount`) as TotalAmount 
FROM `tableName` 
WHERE (start_date >= '2012-01-13 00:00:00' 
      AND 
     end_date <= '2012-01-18 23:59:59')