我们有表格,其数据看起来像
startDate|endDate |price
=========+========+========
1 dec | 15 dec | 100
16 dec |31 dec | 200
1 jan | 31 Jan | 300
1 feb | 10 feb | 30
15 feb | 28 feb | 40
1 march | 15 march | 50
价格是一天的价格。现在我想计算日期之间的价格,比如1dec到10 dec。然后价格将是(100 * 10天)。另一个条件是计算1月1日至15日之间的价格,然后价格将是((100 * 15天)+(200 * 15天)+(300 * 15天))。还有一个条件是计算价格在20feb到5月3日之间,那么价格将是(40 * 8days + 50 * 5)。如何根据数据价格计算。
答案 0 :(得分:0)
首先,您需要选择任何间隔拟合查询日期。然后,您可以计算每个间隔的天数和间隔的价格。然后加总吧。
select
SUM(
DATEDIFF(
if( end_date > '2012-09-12', '2012-09-12', end_date ),
if( start_date < '2012-09-02', '2012-09-02', start_date )
) * price
)
from prices where start_date < '2012-09-12' and end_date > '2012-09-02'
SqlFiddle - http://sqlfiddle.com/#!2/abc0b/11/0
这是INT
中的时间示例select
SUM(
DATEDIFF(
if( end_date > '2012-09-12', '2012-09-12', end_date ),
if( start_date < '2012-09-02', '2012-09-02', start_date )
) * price
)
from (
select
FROM_UNIXTIME( start_date, '%Y-%m-%d' ) as start_date,
FROM_UNIXTIME( end_date, '%Y-%m-%d' ) as end_date,
price
from prices where start_date < UNIX_TIMESTAMP( '2012-09-12' ) and end_date > UNIX_TIMESTAMP( '2012-09-02' )
) as l
编辑:修复示例,感谢小提琴 编辑2:Unix时间戳示例
答案 1 :(得分:0)
也许您可以尝试以下方法:
查询:
select price*10
from prices
where '2012-09-02' between start_date
and start_date + interval 10 day
结果:
PRICE*10
1010
参考:* SQLFIDDLE
Currenlty,间隔只是一个静态值。您可以将此作为动态值传递给查询。为了获得多个日期范围,您需要的是在不同的开始日期之间传递不同的间隔以捕捉价格。如果清楚或者您需要进一步澄清,请告诉我:))
答案 2 :(得分:-1)
编辑:我保留了我的答案,但不再同意,请参阅评论原因。
一个可能的答案,虽然我不认为这是最好的(见其他答案)是对数据进行非规范化:
day | price
=======+======
1 dec | 100
2 dec | 100
3 dec | 100
4 dec | 100
...
15 dec | 100
16 dec | 200
17 dec | 200
...
然后你的回答很简单:
select sum(price) from mytable where day > '1 dec' and day < '15 jan'
这可能会使您的数据更易于使用且更直观,但有一些缺点: