【问题标题】:calculate price between given dates计算给定日期之间的价格
【发布时间】:2012-08-04 08:12:41
【问题描述】:
Hotel_id Room_id Room_type 开始日期 结束日期 价格 -------------------------------------------------- -------------- 13 2 标准 2012-08-01 2012-08-15 7000 13 2 标准 2012-08-16 2012-08-31 7500 13 2 标准 2012-09-01 2012-09-30 6000 13 3 豪华 2012-08-01 2012-08-15 9000 13 3 豪华 2012-08-16 2012-08-31 10000 13 3 豪华 2012-09-01 2012-09-30 9500

您好,这是我的表格的结构和数据。

我需要为酒店预订创建一个 mysql 查询,该查询将匹配数据库用户输入的数据:

  1. 他们想要入住和退房的日期
  2. 房型

例如:

如果用户根据这些日期(2012-08-30 至 2012-09-04)选择带豪华客房的酒店 8 月 30 日和 31 日的总费用为 (10000*2) + 9 月 1 日、2 日和 3 日的总费用为 (9500*3)(不包括第 4 个结帐日) 也就是说总价是20000+28500=48500

因此查询应根据 Hotel_id、Room_id、Start_date、End_date 和 Price 过滤总价

谢谢

【问题讨论】:

  • 欢迎来到 Stack Overflow。你有什么问题?
  • 对不起,但这个问题不是与给定的完全相同:在那个问题中,表格包含每个日期的条目,而在这个问题中是记录仅适用于每个日期范围。我正在投票支持重新提出这个问题。
  • SELECT a.price ,DATEDIFF('2012-09-01','2012-08-29') AS countdays FROM hotel a WHERE a.room_id=3 AND '2012-09-01'在 start_date 和 end_date 之间我已经尝试过了,但没有工作。
  • 抱歉,重复问题只包含一个日期字段,我的故事有开始日期和结束日期。请重新打开这个问题
  • 投票也重新提出问题。

标签: php mysql


【解决方案1】:

使用此解决方案:

SELECT     SUM(
               CASE WHEN a.Start_date = b.min_sd AND a.Start_date <> b.max_sd THEN
                        (DATEDIFF(a.End_date, '2012-08-30')+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-08-30')+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-08-30' AND
                  Start_date <= '2012-09-04'
           ) b
WHERE      a.Room_type   = 'luxury'     AND
           a.End_date   >= '2012-08-30' AND
           a.Start_date <= '2012-09-04'

将出现的2012-08-302012-09-04 分别替换为您输入的开始日期和结束日期。

这将考虑到开始日期和结束日期在同一个月以及跨越多个月。


SQLFiddle Demo

【讨论】:

  • 如果给定的日期与日期数据库不同,如何计算价格?
  • 你太棒了!!
【解决方案2】:

你可以使用 MySQL 的BETWEEN ... AND ... 操作员查找所需预订的日期范围(请记住从给定的结账时间休息一天 日期,就像你说的,没有住宿),然后按房间对结果进行分组并取 SUM()的价格乘以夜数(可以 使用 MySQL 的 LEAST()GREATEST()函数):

SELECT   Room_id,
         SUM(Price * (1 + DATEDIFF(
              LEAST(End_date,   '2012-09-04' - INTERVAL 1 DAY),
           GREATEST(Start_date, '2012-08-30')
         ))) AS Total
FROM     mytable
WHERE    Room_type = 'luxury' AND (
              '2012-09-04' - INTERVAL 1 DAY
                           BETWEEN Start_date AND End_date
           OR '2012-08-30' BETWEEN Start_date AND End_date
         )
GROUP BY Room_id

sqlfidde 上查看。

【讨论】:

    【解决方案3】:

    试试这个:

    set @Hotel_id :=13;
    set @Room_id :=3;
    set @Start_date :='2012-08-30'  ;
    set @End_date :='2012-09-04';
    
     select sum(b.TotalPrice-b.deductions) as total_cost from
    ( select a.Price,a.StartDate,a.EndDate,price*(DATEDIFF(a.EndDate,a.StartDate)+1) as TotalPrice  
     ,case when a.EndDate=@End_date then a.Price else 0 end as deductions
     from
    (select price,case when @Start_date>=Start_date then  @Start_date else Start_date end as StartDate
    ,case when @End_date<=End_date then  @End_date else End_date end as EndDate
     from h_booking h1 
    where  Hotel_id=@Hotel_id
    and Room_id=@Room_id
    and (@Start_date between Start_date and End_date or @End_date between Start_date and End_date ))a )b
    

    【讨论】:

    • 非常感谢,您的查询非常完美,一口气得到了我的答案。继续努力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 2021-12-19
    • 2021-11-16
    • 2012-04-06
    • 1970-01-01
    • 2010-09-14
    相关资源
    最近更新 更多