【问题标题】:Select dates between date range and sum over a column在日期范围和列上选择日期
【发布时间】:2017-04-17 06:52:54
【问题描述】:

我有以下表格:

让我们假设第一个表代表客户对酒店的预订。

+------------+-----------+-----------+--------------+----------------+
| booking_id | client_id | room_type | arrival_date | departure_date |
+------------+-----------+-----------+--------------+----------------+
|          1 |         1 |         1 | 2016-05-30   | 2016-06-03     |
+------------+-----------+-----------+--------------+----------------+

第二个表格包含不同类型房间的价格。不同时期的价格不同。

+---------------+-----------+------------+------------+-------+
| room_price_id | room_type | start_date |  end_date  | price |
+---------------+-----------+------------+------------+-------+
|             1 |         1 | 2016-03-01 | 2016-05-31 |   150 |
|             2 |         1 | 2016-06-01 | 2016-08-31 |   200 |
+---------------+-----------+------------+------------+-------+

我的问题是:如果整个预订期间的价格不同,我如何计算预订的总费用? (在我的情况下,总成本为 700)

我阅读了以下链接:MySQL: Select all dates between date range and get table data matching datesSelect data from date range between two dates,但我不知道如何解决我的问题,因为价格表中的条目仅包含日期范围,而不包含明确的日期,如第一个链接。

【问题讨论】:

  • 我觉得总价应该是900吧?

标签: mysql sql date range


【解决方案1】:

您的问题的诀窍在于制定bookingprices 表之间的连接条件。一旦这不碍事,一个简单的聚合就能得到你想要的结果。只要给定价格范围内的任何点落在到达或离开日期的范围内,连接条件就应该为真。

然后,为了计算天数,我们使用到达日期或开始日期的较大的,以及出发日期或结束日期的较小的

SELECT
    b.booking_id,
    SUM((DATEDIFF(LEAST(b.departure_date, p.end_date),
             GREATEST(b.arrival_date, p.start_date)) + 1) * p.price) AS total
FROM booking b
INNER JOIN prices p
    ON b.room_type = p.room_type AND
       (p.start_date BETWEEN b.arrival_date AND b.departure_date OR
        p.end_date   BETWEEN b.arrival_date AND b.departure_date)
GROUP BY b.booking_id;

您的样本数据的输出是 900。这是正确的,因为:

2 days x 150 = 300
3 days x 200 = 600
       total = 900

演示在这里:

SQLFiddle

还有here is another demo,它强调了住宿与整个价格范围重叠的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多