讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在指定日期范围内搜索可用房间?

酷瑶小哥_4950

酷瑶小哥_4950

发布时间:2026-04-08 12:13:15

|

748人浏览过

|

来源于php中文网

原创

如何在指定日期范围内搜索可用房间?

本文详解如何通过 sql 查询实现房间可用性搜索,重点解决日期范围重叠判断逻辑错误,提供 codeigniter 框架下的正确 join 与 where 条件写法,并附可运行示例及关键注意事项。

本文详解如何通过 sql 查询实现房间可用性搜索,重点解决日期范围重叠判断逻辑错误,提供 codeigniter 框架下的正确 join 与 where 条件写法,并附可运行示例及关键注意事项。

在酒店、公寓或会议室预订系统中,“按日期范围搜索可用房间”是一个核心功能。其本质是:找出所有未被任何现有订单完全覆盖(即无时间重叠)的房间。常见误区是将日期冲突逻辑写反,或错误地在 WHERE 中对 LEFT JOIN 的右表字段施加条件,导致关联失效(如 b.brId IS NULL 被误用)。

✅ 正确的日期重叠判断逻辑

两个日期区间 [start1, end1] 和 [start2, end2] 不重叠 的充要条件是:

end1 = end2

因此,存在重叠 的条件为:

end1 > start2 AND start1

在本场景中,用户输入的查询区间为 [$start, $end)(注意:通常 checkout 是入住次日,故区间为左闭右开),需排除所有满足 bCheckin $start 的已预订记录。

✅ 修正后的 CodeIgniter 查询函数(推荐写法)

function search($room, $start, $end) {
    // 注意:$start 和 $end 应为 Y-m-d 格式字符串,且已通过 escape 或绑定参数防护 SQL 注入
    $this->db->select('r.rId as id,
                       r.rName as name,
                       r.rCapacity as capacity,
                       b.bCheckin as checkin,
                       b.bCheckout as checkout,
                       b.bBookingTime as bookingtime');
    $this->db->from('room r');

    // 关键:使用 LEFT JOIN + ON 条件过滤预订,而非 WHERE 过滤
    $this->db->join('booking b', 'b.brId = r.rId 
        AND b.bCheckin < "' . $end . '" 
        AND b.bCheckout > "' . $start . '"', 'left');

    // 筛选房间名(模糊匹配)
    $this->db->like('r.rName', $room);

    // 关键:仅保留“无冲突预订”的房间 → 即 b.brId 为 NULL 的行
    $this->db->where('b.brId IS NULL');

    return $this->db->get()->result_array();
}

⚠️ 原代码主要问题解析

  • ❌ where('bCheckout' > $start AND 'bCheckin'
  • ❌ where('brId', NULL):CodeIgniter 中应写为 where('brId IS NULL') 或 where('brId', null, false)。
  • ❌ 原生 SQL 中 WHERE 子句重复、表别名不一致(b.orderRuangan 字段不存在)、日期逻辑颠倒(NOT ($end >= ...) 表达不准确)。

✅ 更安全的原生 SQL(带参数化占位符示意)

SELECT r.rId AS id,
       r.rName AS name,
       r.rCapacity AS capacity,
       b.bCheckin AS checkin,
       b.bCheckout AS checkout,
       b.bBookingTime AS bookingtime
FROM room r
LEFT JOIN booking b 
  ON b.brId = r.rId 
  AND b.bCheckin < ?   -- $end
  AND b.bCheckout > ?   -- $start
WHERE r.rName LIKE ?
  AND b.brId IS NULL;

✅ 推荐使用 $this->db->query($sql, [$end, $start, "%{$room}%"]) 执行,避免 SQL 注入。

? 验证逻辑的小技巧

假设某房间有预订:checkin='2025-06-10', checkout='2025-06-15'

  • 用户搜 2025-06-01 → 2025-06-05:✅ 无重叠 → 房间显示
  • 用户搜 2025-06-12 → 2025-06-14:❌ 重叠 → 房间隐藏
  • 用户搜 2025-06-15 → 2025-06-18:✅ 边界不重叠(若 checkout 为入住次日,则 2025-06-15 可入住)→ 显示

✅ 总结

  • 日期重叠判断务必使用 bCheckin $start;
  • 利用 LEFT JOIN 的 ON 子句提前过滤冲突预订,再用 WHERE b.brId IS NULL 筛出干净房间;
  • 始终对用户输入执行转义或参数化查询;
  • 在真实项目中,建议补充索引:booking(brId, bCheckin, bCheckout) 提升查询性能。

掌握此模式后,即可轻松扩展为多房间批量检查、按容量/价格筛选等高级功能。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

更多
format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1829

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1231

2024.06.27

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

20

2026.11.05

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

20

2026.11.04

XORM框架结构体映射与表结构同步
XORM框架结构体映射与表结构同步

本专题围绕XORM框架的结构体映射展开,说明表名与字段的命名策略、xorm标签常用属性、主键自增与时间字段自动填充,并演示Sync2自动建表、增量字段升级、索引声明与反向生成结构体的完整流程。

20

2026.11.04

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

20

2026.11.04

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

0

2026.11.04

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

0

2026.11.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn