2

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

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

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

4

3 回答 3

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

于 2012-11-26T09:19:03.237 回答
0

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

询问:

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

结果:

PRICE*10
1010

参考:* SQLFIDDLE

当前间隔只是一个静态值。您可以将其作为动态值传递给您的查询。为了获得涉及的多个日期范围,您只需要在不同的开始日期之间传递不同的间隔来捕捉价格。让我知道是否清楚或您需要进一步澄清:)

于 2012-11-26T09:23:19.707 回答
-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 行慢
  • 更新可能会更慢(出于同样的原因)。
于 2012-11-26T09:16:33.627 回答