2013-04-30 91 views
1

嗨下面的代码适用于两个或更多范围但不是当开始日期和结束日期在相同范围内时使用。当开始日期和结束日期在相同的范围内时,总价格会返回额外的一天。因此,一晚的总价格翻了一番。计算多个范围中给定日期之间的价格

这里是mysql表;

CREATE TABLE rooms (
Hotel_id INT, 
Room_id INT, 
Room_type VARCHAR(20), 
Start_date DATE, 
End_date DATE, 
Price INT 
); 

INSERT INTO rooms VALUES 
( 13 ,  2  , 'standard' , '2012-08-01' , '2012-08-15' , 7000), 
( 13 ,  2  , 'standard' , '2012-08-16' , '2012-08-31' , 7500), 
( 13 ,  2  , 'standard' , '2012-09-01' , '2012-09-30' , 6000), 
( 13 ,  3  , 'luxury' , '2012-08-01' , '2012-08-15' , 9000), 
( 13 ,  3  , 'luxury' , '2012-08-16' , '2012-08-31' , 10000), 
( 13 ,  3  , 'luxury' , '2012-09-01' , '2012-09-30' , 9500), 
( 13 ,  3  , 'luxury' , '2012-10-01' , '2012-10-15' , 15000); 

这是代码;

SELECT  SUM(
      CASE WHEN a.Start_date = b.min_sd AND a.Start_date <> b.max_sd THEN 
        (DATEDIFF(a.End_date, '2012-09-03')+1) * a.Price 
       WHEN a.Start_date = b.max_sd AND a.Start_date <> b.min_sd THEN 
        DATEDIFF('2012-09-04', a.Start_date) * a.Price 
       WHEN (a.Start_date,a.Start_date) IN ((b.min_sd,b.max_sd)) THEN 
        (DATEDIFF('2012-09-04', '2012-09-03')+1) * a.Price 
       WHEN a.Start_date NOT IN (b.min_sd, b.max_sd)    THEN 
        (DATEDIFF(a.End_date, a.Start_date)+1) * a.Price 
      END 
     ) AS totalprice 
FROM  rooms a 
CROSS JOIN (
     SELECT MIN(Start_date) AS min_sd, 
       MAX(Start_date) AS max_sd 
     FROM rooms 
     WHERE Room_type = 'luxury'  AND 
       End_date >= '2012-09-03' AND 
       Start_date <= '2012-09-04' 
     ) b 
WHERE  a.Room_type = 'luxury'  AND 
     a.End_date >= '2012-09-03' AND 
     a.Start_date <= '2012-09-04'; 
+0

查询目标的简要概要将有所帮助。这就是我发现的......第三个'WHEN'中的+1是上述情况的总和的两倍。所以也许你需要添加另一个'WHEN'来处理不适合你的场景。例如,当开始日期>结束日期时,请勿+1。 – davmos 2013-04-30 18:57:54

回答

3

你可以使用这样的查询:

SELECT 
    SUM(
    DateDiff(
     Least(End_Date + INTERVAL 1 DAY, '2012-09-04'), 
     Greatest(Start_Date, '2012-08-31') 
    ) * Price 
) 
FROM 
    rooms a 
WHERE 
    a.Room_type = 'luxury'  AND 
    a.End_date >= '2012-08-31' AND 
    a.Start_date < '2012-09-04'; 

请参阅小提琴here

+0

谢谢fthiella,效果很好,而且非常简单 – jamestan 2013-05-01 10:37:37