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