在mysql,java中计算日期范围内的价格

时间:2012-11-26 09:09:45

标签: java mysql

我们有表格,其数据看起来像

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)。如何根据数据价格计算。

3 个答案:

答案 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'

这可能会使您的数据更易于使用且更直观,但有一些缺点:

  • 可能会慢一点;如果范围长时间保持相同,则查询多行的速度比1行慢
  • 更新速度可能较慢(出于同样的原因)。
相关问题