【问题标题】:Total Price between date range (like hotel reservation seasons)日期范围内的总价格(如酒店预订季节)
【发布时间】:2014-05-31 22:10:40
【问题描述】:
 id       carID     date1         date2      price
 ---      ----     ---------    ---------    -----
 1        1       1000-01-01    9999-12-31   100

 2        2       1000-01-01    2014-06-06   100 
 3        2       2014-06-07    2014-06-07   150
 4        2       2014-06-08    9999-12-31   100

 5        3       1000-01-01    2014-06-01   150
 6        3       2014-06-02    2014-07-01   200
 7        3       2014-07-02    2014-07-25   300
 8        3       2014-07-26    9999-12-31   100 

这是我的价格表;我想用我的日期范围计算总价。

我想显示所有汽车的总价;

例如我的过滤日期:

date1:​​ 2014-06-01
date2: 2014-06-22

结果

CARID    TOTAL
------ ------
1      2100
2      2150
3      4150

我试试这个,但它只适用于一个汽车 ID。
calculate price between given dates
还有这个;
calculate price between given dates in multiple ranges

【问题讨论】:

  • 请您添加预期结果
  • “计算酒店预订”? “显示所有汽车”?至少我们中的一个人很困惑。
  • @horaciux 将列出三辆车。汽车 ID 和总价。汽车ID 1 -> 100*21 = 2100 汽车ID 2 -> (100*5)+150+(15*100)=2150 汽车ID 3 -> 150+(20*200)=4150
  • @GordonLinoff 喜欢酒店预订系统、carID 或 hotelID。日期范围对我很重要

标签: mysql sql date range


【解决方案1】:

假设您有变量 @date1@date2,您可以使用条件聚合来做到这一点:

select carid,
       sum(1 + greatest(least(date2, @date2) - greatest(date1, @date1), 0) * price)
from table t
group by carid;

这只是将表中每个周期的边界替换为与外部边界的交集。然后它总结了持续时间乘以价格。 1 + 似乎处理了date2 似乎是价格有效日期的情况,而不是第一个不活跃的日期。

【讨论】:

  • 干得好!这是工作。但如果 date1 和 date2 相同则不起作用。我像这样使用 SUM(greatest(least(f.date2, '$date2') - best(f.date1, '$date1'), 0) * f.iTutar)/$day as iTutar
  • 如果月份不一样,代码不起作用,您可以再检查一下吗?
  • @imugur 。 . .范围的含义取决于第二个日期是否属于范围的一部分。通过在计算中明智地添加或减去1,可以解决此类问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 2012-02-20
  • 2014-05-17
相关资源
最近更新 更多