如何查询MySQL数据库某个日期范围内的每一天?

问题描述 投票:0回答:1

我有这三张桌子:

酒店
酒店_id
酒店名称
房间
房间_id
酒店_id
房间价格
房间_id
日期
价格

我知道如何查询数据库来获取给定 room_id 和给定酒店住宿日期的价格。所以我可以做到这一点,但是,当涉及到在很长的日期范围内执行此操作时,这变得不切实际。

sql mysql mysql-5.7
1个回答
1
投票

您可以动态创建日期系列,如 Bagus Tesa 建议的 答案 所示,或者维护日历表。鉴于日期在预订/预订应用程序中发挥着重要作用,我建议创建一个简单的日历表。

在本例中,我使用的日历表只有一个 dt (

DATE
) 列,您可以轻松地使用存储过程(或您选择的任何其他方法)填充该列:

CREATE TABLE calendar (dt DATE NOT NULL PRIMARY KEY);

DELIMITER $$
CREATE PROCEDURE `filldates`(dateStart DATE, dateEnd DATE)
BEGIN
  WHILE dateStart <= dateEnd DO
    INSERT INTO calendar (dt) VALUES (dateStart);
    SET dateStart = dateStart + INTERVAL 1 DAY;
  END WHILE;
END$$
DELIMITER ;

CALL filldates('2023-01-01', '2039-12-31');

然后是预订日期和房间日期之间的

CROSS JOIN
的简单情况,以及用于检索每天每间房间的价格的相关子查询:

SET @checkin = '2023-11-26', @checkout = '2023-12-15';

SELECT r.room_id, COUNT(*) AS nights, (
    SELECT price
    FROM room_price
    WHERE room_id = r.room_id
    AND start_date <= c.dt
    ORDER BY start_date DESC
    LIMIT 1
) AS price
FROM calendar c
CROSS JOIN room r
WHERE c.dt >= @checkin AND c.dt < @checkout
GROUP BY room_id, price;

注意:虽然关键字

CROSS
在MySQL中没有任何意义(它只是一个没有ON子句的INNER连接),但我认为它清楚地表达了意图。

这是一个db<>小提琴

© www.soinside.com 2019 - 2024. All rights reserved.