2012-11-26 64 views
2

我们有表和它的数据看起来像计算价格在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 

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

+0

为什么不计算在计算器上? –

+1

您需要从数据库中获取日期,然后获取datediff并将datediff(天)与价格相乘。 –

+0

+1有趣的问题:) – bonCodigo

回答

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

+0

startDate和endDate存储为bigint值。 ow如果运行您的查询我得到以下错误 – user1852812

+0

错误代码:1579 调用本地函数'DATEDIFF'中的参数不正确 – user1852812

+0

告知此问题是有益的。 – SergeS

-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行慢。
  • 更新(出于同样的原因)可能会更慢。
+1

非规范化是一个地狱 – SergeS

+0

@SergeS是否有一篇很好的文章,你可以联系我解释为什么?这听起来像你(和同意的赞同)对此有强烈的意见。 –

+0

+重叠可以通过删除endDate(并总是计算)来解决 - 它会使选择更困难,但它解决了这个问题。查询成本是很快的 - 你为什么这么认为?超过90行的查询比查询超过6行的查询速度更快?更新范围的价格更容易 - 与以前相同 - 更新15行比更新1行更快? – SergeS

0

也许你可以请尝试以下操作:

查询:

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

结果:

PRICE*10 
1010 

参考:* SQLFIDDLE

Currenlty的间隔仅仅是一个静态值。您可以将其作为动态值传递给您的查询。为了获得多个日期范围,您只需在不同的开始日期之间传递不同的时间间隔即可获得价格。让我知道如果它是明确的,或者如果您需要进一步澄清:)

+0

如果第一个时间间隔为5天,第二个10和第三个15,会发生什么? – SergeS

+0

也是你的例子有一个错误 - 结束日期在哪里? – SergeS

+0

@SergeS你能告诉我错误在哪里吗?它可以在附加的SQLFIDDLE中正常工作。 :)无论如何,我意识到OP的要求远比我得到的第一印象先进。我注意到价格上的错误。它应该是1010.修正。 – bonCodigo