繁体   English   中英

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

[英]calculate price in date range in mysql,java

我们有表,它的数据看起来像

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

这个价格是一天的价格。 现在我想计算日期,例如1月12日至10月10日。 那么价格将为(100 * 10天)。 另一个条件是计算12月1日至1月15日之间的价格,那么价格将为((100 * 15天)+(200 * 15天)+(300 * 15天))。 另一个条件是计算价格在2月20日至3月5日之间,则价格将为(40 * 8天+ 50 * 5)。 如何根据数据价格进行计算。

首先,您需要选择任何适合间隔的查询日期。 然后,您可以计算每个间隔的天数和间隔的价格。 然后简单地总结一下。

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时间戳示例

也许您可以尝试以下方法:

查询:

select price*10
  from prices
  where '2012-09-02' between start_date
  and start_date + interval 10 day

结果:

PRICE*10
1010

参考:* SQLFIDDLE

间隔时间只是一个静态值。 您可以将其作为动态值传递给查询。 为了获得多个日期范围,您所需要做的就是在不同的开始日期之间传递不同的时间间隔以赶上价格。 让我知道是否清楚,或者您是否需要进一步说明:)

编辑 :我保留了我的答案,但不再同意,请查看评论以了解原因。

一个可能的答案,尽管我认为这不是最好的(请参阅其他答案),是对数据进行非规范化:

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行慢
  • 由于相同的原因,更新可能较慢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM