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')