我有下表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语句如何返回总预订价格应该如何?
答案 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非常感谢,我已经创建了一个程序,它会在预订期间循环显示所有日期,获取多个价格并将它们作为解决方案求和,但我知道应该有一个更简单,更有效的解决方案