0

我有下表 SEA​​SONS ,其时间段定义了每个时间段的预订价格;

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 语句应该是什么样子?

4

2 回答 2

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
于 2012-06-23T23:20:05.450 回答
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 非常感谢,我已经创建了一个程序,它遍历预订期间的所有日期,获取多个价格并将它们相加作为解决方案,但我知道应该有一个更简单、更有效的解决方案

于 2012-06-24T18:52:32.170 回答