You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:39:00