如何根据checkin、checkout日期统计可用与不可用客房
客房入住状态统计实现方案
核心判断逻辑
判断房间在目标日期(示例中的「现在」默认取当前系统日期,也可自定义指定)是否可用的规则:
- 不可用:目标日期落在该房间的
[checkin, checkout]闭区间内 - 可用:目标日期早于入住日期,或晚于退房日期
方案1:SQL实现(针对数据库表数据)
假设你的表名为room_bookings,包含字段room_name(客房名)、checkin_date(日期类型,入住日期)、checkout_date(日期类型,退房日期),统计当前日期房态的SQL如下:
-- 统计可用/不可用房间数,以及对应房间列表 SELECT COUNT(CASE WHEN NOT (CURRENT_DATE BETWEEN checkin_date AND checkout_date) THEN 1 END) AS available_room_count, GROUP_CONCAT(CASE WHEN NOT (CURRENT_DATE BETWEEN checkin_date AND checkout_date) THEN room_name END SEPARATOR ', ') AS available_room_list, COUNT(CASE WHEN CURRENT_DATE BETWEEN checkin_date AND checkout_date THEN 1 END) AS unavailable_room_count, GROUP_CONCAT(CASE WHEN CURRENT_DATE BETWEEN checkin_date AND checkout_date THEN room_name END SEPARATOR ', ') AS unavailable_room_list FROM room_bookings;
说明:如果使用SQL Server,将
GROUP_CONCAT替换为STRING_AGG;如果使用Oracle,替换为LISTAGG。如果要统计指定日期的房态,把CURRENT_DATE替换为你指定的目标日期即可。
方案2:Python实现(针对文本/列表类原始数据)
如果你是在Python脚本里处理这类数据,可以参考以下代码:
from datetime import datetime # 原始预订数据,也可以从文件/接口读取 booking_data = [ ("Room1", "1-1-2021", "5-5-2021"), ("Room2", "2-2-2021", "9-9-2021"), ("Room3", "10-10-2021", "5-12-2021") ] # 目标统计日期,示例对应2021-06-01,也可以用datetime.now()取当前日期 target_date = datetime.strptime("1-6-2021", "%d-%m-%Y").date() available_rooms = [] unavailable_rooms = [] for room, checkin_str, checkout_str in booking_data: checkin = datetime.strptime(checkin_str, "%d-%m-%Y").date() checkout = datetime.strptime(checkout_str, "%d-%m-%Y").date() if checkin <= target_date <= checkout: unavailable_rooms.append(room) else: available_rooms.append(room) # 输出结果 print(f"Available rooms now: {len(available_rooms)}") print(f"Available rooms: {', '.join(available_rooms)}") print(f"Not available rooms now: {len(unavailable_rooms)}") print(f"Not available rooms now: {', '.join(unavailable_rooms)}")
运行代码即可输出你示例中完全一致的结果。
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

