如何编写JavaScript函数从SQL Server查询指定日期范围内未预订的公寓
问题核心修正点
你原有代码存在两个核心问题:
- SQL逻辑错误:仅排除了预订时段完全落在用户查询时段内的公寓,实际上只要预订时段和用户选择的时段存在任何重叠,该公寓都不可租
- 前端不能直接直连SQL Server:会暴露数据库凭证导致严重安全风险,正确流程是前端传参给后端接口,由后端执行SQL查询后返回结果
正确SQL查询逻辑
判断两个时间段是否重叠的通用规则是:用户入住日期 < 预订结束日期 AND 用户退房日期 > 预订开始日期,符合该条件的公寓都要排除,正确SQL写法如下(使用参数化查询避免注入):
SELECT * FROM Apartments WHERE Id NOT IN ( SELECT ApartmentId FROM Bookings WHERE @userStart < EndDate AND @userEnd > StartDate )
其中@userStart、@userEnd是后端接收的用户输入的起止日期参数。
修正后前端JS代码
前端仅负责参数收集、接口调用和结果渲染,示例代码如下:
async function searchAvailableApartments() { const start = document.getElementById("start").value; const end = document.getElementById("end").value; // 前端先做参数合法性校验 if (!start || !end || new Date(start) >= new Date(end)) { alert("请选择合法的入住/退房日期,退房日期必须晚于入住日期"); return; } try { // 请求后端查询接口 const res = await fetch("/api/get-available-apartments", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ startDate: start, endDate: end }) }); if (!res.ok) throw new Error("接口请求失败"); const apartmentList = await res.json(); // 此处添加你的列表渲染逻辑 console.log("可用公寓列表:", apartmentList); } catch (err) { console.error("查询失败:", err); alert("查询可用公寓失败,请稍后重试"); } }
额外注意事项
- 后端执行SQL必须使用参数化查询,禁止直接拼接用户输入的日期字符串,防止SQL注入
- 统一前后端、数据库的时区设置,避免日期判断出现偏差
- 数据量较大时可以给Bookings表的
StartDate、EndDate、ApartmentId字段加联合索引,提升查询效率
内容的提问来源于stack exchange,提问作者Hauhet
相关产品推荐
相关产品推荐

