SELECT返回总预订价格

时间:2012-06-23 23:14:46

标签: mysql period

我有下表SEASONS,其中包含定义每个期间日的预订价格的时间段;

ID, STARTDATE,  ENDDATE,    PRICE
 6, 2012-06-01, 2012-06-30, 20
 7, 2012-07-01, 2012-07-31, 35
 8, 2012-08-01, 2012-08-31, 30
 9, 2012-09-01, 2012-09-30, 25

此表定义了定价期间(定价期间的开始和结束日期,以及特定定价期间每天的预订价格)。问题是如何创建一个查询,该查询将返回某个预定期间内所有日期的预订总价?例如,如何计算(SELECT?)2012-06-10至2012-08-20期间的总(SUM)预订价格?

(当然人们可以轻松地手动计算= 21(6月的天数)x20 + 31(7月的天数)x35 + 20(8月的天数)x30 = 2105)SELECT语句如何返回总预订价格应该如何?

2 个答案:

答案 0 :(得分:1)

使用DATEDIFF功能:

SELECT SUM(DATEDIFF(ENDDATE,STARTDATE) * PRICE) AS TOTAL_PRICE
    FROM SEASONS
    WHERE STARTDATE <= '2012-06-10' AND ENDDATE >= '2012-08-20'

此外,我们可以添加支票预订开始/结束,因为它们位于中间位置,您不需要包含所有期间......

所以:

SET @START='2012-06-10';
SET @END='2012-08-20';
SELECT SUM(
  DATEDIFF(
    IF(YEAR(ENDDATE)=YEAR(@END) AND MONTH(ENDDATE)=MONTH(@END), @END, ENDDATE),
    IF(YEAR(STARTDATE)=YEAR(@START) AND MONTH(STARTDATE)=MONTH(@START), @START, STARTDATE)
     )
  ) AS TOTAL_SUM
FROM SEASONS
WHERE STARTDATE <= @END AND ENDDATE >= @START

答案 1 :(得分:0)

仅针对其他读者,作为上一个答案的结果,最终查询是:

SET @START='2012-06-10';
SET @END='2012-08-20';
SELECT SUM(
 (DATEDIFF(
   IF(enddate>=@END,@END,enddate),      
   IF(startdate<=@START,@START,startdate)
 )+1)*price ) AS TOTAL_SUM
FROM seasons WHERE startdate<=@END AND enddate>=@START

1应添加到日期差异中,以便开始日期和结束日期都包含在定价范围内,当然,它应该与价格相乘。

@poncha非常感谢,我已经创建了一个程序,它会在预订期间循环显示所有日期,获取多个价格并将它们作为解决方案求和,但我知道应该有一个更简单,更有效的解决方案