Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql中计算日期范围内的价格,java_Java_Mysql - Fatal编程技术网

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

在mysql中计算日期范围内的价格,java,java,mysql,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 价格是一天的价格。现在我想计算从1日到12月10日之间的价

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

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日之间的价格。然后价格将是100*10天。另一个条件是计算12月1日至1月15日之间的价格,然后价格将为100*15天+200*15天+300*15天。还有一个条件是计算2月20日至3月5日之间的价格,那么价格将为40*8天+50*5天。如何根据数据计算价格

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

一个可能的答案,虽然我不认为这是最好的,但其他答案是对数据进行非规范化:

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'
这可能会使您的数据更易于使用和更直观,但也有一些缺点:

它可能会慢一些;如果范围长时间保持不变,则查询多行比查询一行慢 出于同样的原因,更新速度可能较慢。 编辑:我保留了我的答案,但不再同意,请查看评论了解原因

一个可能的答案,虽然我不认为这是最好的,但其他答案是对数据进行非规范化:

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'
这可能会使您的数据更易于使用和更直观,但也有一些缺点:

它可能会慢一些;如果范围长时间保持不变,则查询多行比查询一行慢 出于同样的原因,更新速度可能较慢。
首先,您需要选择任何间隔拟合查询日期。然后,您可以计算每个间隔的天数和间隔的价格。那就算了

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-

这是以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 
 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-

这是以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
参考资料:*


目前,间隔仅仅是一个静态值。您可以将其作为动态值传递给查询。为了获得多天的价格区间,您只需在不同的开始日期之间传递不同的时间间隔,以了解价格。如果清楚或需要进一步澄清,请告诉我:

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

查询:

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

PRICE*10
1010
参考资料:*



目前,间隔仅仅是一个静态值。您可以将其作为动态值传递给查询。为了获得多天的价格区间,您只需在不同的开始日期之间传递不同的时间间隔,以了解价格。如果清楚或需要进一步澄清,请告诉我:

为什么不使用计算器计算?您需要从数据库中获取日期,然后获取datediff并将datediff天数乘以价格。+1有趣的问题:为什么不使用计算器计算?您需要从数据库中获取日期,然后得到datediff并将datediff天与价格相乘。有趣的问题是+1:反规范化有点困难hell@SergeS有没有一篇好文章可以让我解释一下原因?听起来你和赞成的投票人对此有强烈的意见。+重叠可以通过删除endDate并始终计算它来解决-这将使选择更加困难,但它解决了这个问题。计算成本的查询速度很快——你为什么这么认为?查询超过90行比查询超过6行快?更新一个范围的价格更容易-和以前一样-更新15行比更新1行更快?答案的一部分在我对您的好处的回复中。。。但基本上,任何时候需要选择/更新更多数据时,速度都会变慢。。。规范化将减少数据量反规范化有点困难hell@SergeS有没有一篇好文章可以让我解释一下原因?听起来你和赞成的投票人对此有强烈的意见。+重叠可以通过删除endDate并始终计算它来解决-这将使选择更加困难,但它解决了这个问题。计算成本的查询速度很快——你为什么这么认为?查询超过90行比查询超过6行快?更新一个范围的价格更容易-和以前一样-更新15行比更新1行更快?答案的一部分在我对您的好处的回复中。。。但基本上,任何时候需要选择/更新更多数据时,速度都会变慢。。。正常化将减少数据量,如果第一个间隔为5天,第二个间隔为10天,第三个间隔为15天,会发生什么情况?@SergeS您能告诉我错误在哪里吗?它在附带的SQLFIDDLE中运行良好:无论如何,我意识到OP的要求比我得到的第一印象要先进得多。我注意到价格上的错误。应该是1010。修正了,这就是问题所在
... 这让我头晕目眩,所以我看到了中间的错误,如果第一次间隔5天,第二次间隔10天,第三次间隔15天,会发生什么?@SergeS,你能告诉我错误在哪里吗?它在附带的SQLFIDDLE中运行良好:无论如何,我意识到OP的要求比我得到的第一印象要先进得多。我注意到价格上的错误。应该是1010。修正了,这就是问题所在。。。它弄得我头晕目眩,所以我看到表startDate和endDate之间的错误被存储为bigint值。如果运行your查询,我会得到以下错误代码:1579对本机函数“DATEDIFF”的调用中参数不正确如果end_date>UNIX_时间戳“2012-11-15”*1000,UNIX_时间戳“2012-11-15”*1000,end_date,如果start_date1355509800352尝试复制我的示例,然后使用第二个示例,你能给我发送时间戳日期吗?表中的开始日期和结束日期存储为bigint值。如果运行your查询,我会得到以下错误代码:1579对本机函数“DATEDIFF”的调用中参数不正确如果end_date>UNIX_时间戳“2012-11-15”*1000,UNIX_时间戳“2012-11-15”*1000,end_date,如果start_date1355509800352尝试复制我的示例,然后使用第二个示例,你能给我发送时间戳日期吗?