Mysql 选择日期交叉点

Mysql 选择日期交叉点,mysql,sql,Mysql,Sql,我有这张桌子 +------+--------+-------------------------+ | 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 | +------+--------+------

我有这张桌子

+------+--------+-------------------------+
|  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

一个查询就可以吗?
那有可能吗

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

选择SUM(amount)
SELECT SUM(amount)
FROM TableX
WHERE start_date <= @EndDate
  AND @StartDate <= end_date
从表中 其中开始日期<代码>选择总和(金额) 从表中 其中开始日期从开始日期>'2012-01-13'和结束日期>'2012-01-18'的表格中选择总和(金额)

从开始日期>'2012-01-13'和结束日期>/p>的表格中选择总和(金额)

当然,您可以执行以下操作:

select sum(amount) from my_dates where start_date >= '2012-01-13' and end_date <= '2012-01-18'
从开始日期>='2012-01-13'和结束日期中选择总和(金额)当然,您可以执行以下操作:

select sum(amount) from my_dates where start_date >= '2012-01-13' and end_date <= '2012-01-18'
从开始日期>='2012-01-13'和结束日期中选择总和(金额)
选择总和(`amount`)作为总金额
从`表名`
其中(开始日期>='2012-01-13 00:00:00'
及
结束日期
选择SUM(`amount`)作为总金额
从`表名`
其中(开始日期>='2012-01-13 00:00:00'
及

结束日期如果你相信,任何事情都有可能!事实上,你能在这里更详细地说一下吗?这个请求听起来像是你想要一个包容性的集合,但例子表明不是这样。谁投了反对票,为什么?没有评论为什么,你希望实现什么?@Dems感谢你的支持:如果你相信,一切都有可能!事实上lly,你能在这里更详细地说一下吗?这个请求听起来像是你想要一个包容性的集合,但例子显示了另一种情况。谁投了反对票,为什么?没有评论为什么,你希望实现什么?@Dems谢谢你的反对票:P+1:这是绝对正确的。但我会添加一些额外的内容。如果你有关于
start\u date,end\u date
,您实际上只从
start\u date
部分受益。在这一部分中,您只需指定
start\u date=@startDate-(longestPeriod)
。在大型数据集中,这可以大大减少被检查的记录数。这导致我在这种模式中强制执行最大持续时间,然后有多个记录来表示更长的时间。我已经尝试过此解决方案,但它不起作用。你知道为什么吗?我忘了引用日期!我很笨…:)@戴姆斯:很好。这种两个(或更多)范围的条件总是很难优化。我猜添加
和(@StartDate longestPeriod)@ypercube:可能不会太多,至少如果索引是
(开始日期,结束日期)
。对于任何给定的开始日期,通常很少有不同的结束日期,因此它可能只是以任何方式扫描它们。有效地,使用复合索引,并且对于所选范围的
开始日期
结束日期
字段也可以是随机顺序。在(开始日期)和(结束日期)上有两个简单的索引,你可能会得到一个索引合并,这可能会产生一点好处,但我对此表示怀疑。+1:这是绝对正确的。但我会添加一些额外的内容。如果你在
start\u date,end\u date
上有一个索引,你实际上只会从
start\u date
部分受益。在这一部分,你只指定
start\u date=@startDate-(longestPeriod)
。在大型数据集中,这可以大大减少被检查的记录数。这导致我在这种模式中强制执行最大持续时间,然后有多个记录来表示更长的周期。我已经尝试过这种解决方案,但它不起作用。你知道为什么吗?我忘了引用日期!我很笨…:)@戴姆斯:很好。这种两个(或更多)范围的条件总是很难优化。我猜添加
和(@StartDate longestPeriod)@ypercube:可能不会太多,至少如果索引是
(开始日期,结束日期)
。对于任何给定的开始日期,通常很少有不同的结束日期,因此它可能只是以任何方式扫描它们。有效地,使用复合索引,并且对于所选范围的
开始日期
结束日期
字段也可以是随机顺序。在(开始日期)和(结束日期)上有两个简单的索引,您可能会得到一个索引合并,这可能会产生一个小的好处,但我怀疑它。
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')