航班预订系统MySQL实现指定日期单程航班查询问题求解
航班按日期筛选可行实现方案
核心问题说明
你当前的阻塞点是AircraftFlightDates表存储的operating day为星期维度值,用户输入的是具体公历日期,只需要把公历日期转换为对应星期值,即可完成匹配,以下是可落地的实现步骤:
步骤1:标准化operating day存储规则
先统一该字段的存储格式,避免后续转换出错:
- 优先存储星期数值编码,对齐你所用技术栈的日期处理规则即可,比如可以约定1=周一、2=周二…7=周日,或者直接和数据库日期函数返回值规则对齐
- 如果存量数据存储的是星期字符串(如"Tuesday"、"周二"),要先做数据清洗,统一为全中文/全英文,不要混合存储全称、缩写
步骤2:日期转星期匹配实现
有两种实现路径可选,根据你的技术栈适配即可:
路径1:SQL层直接转换(开发成本最低)
直接用数据库自带的日期函数把用户输入的日期转成对应星期值,和operating day匹配,不需要修改太多业务代码。
以MySQL为例,修正后的查询代码如下:
// userInputDate为用户输入的日期字符串,格式为yyyy-MM-dd,比如"2021-11-23" String searchOneWay = "SELECT `flight #`, `a. time`, `d. time`, `departing airport`, `arriving airport`, `2-let ID` " + "FROM FlightOperatedby JOIN AircraftFlightDates USING(`2-let ID`) " + "WHERE `operating day` = DAYOFWEEK(?) "; // 后续追加出发机场、到达机场等其他筛选条件即可
说明:
- 如果
operating day存的是数值:DAYOFWEEK('2021-11-23')返回值为3,对应周二,直接匹配即可 - 如果
operating day存的是英文星期字符串:把函数替换为DAYNAME('2021-11-23'),返回值为"Tuesday" - 如果存的是中文星期字符串:可以在业务层先做日期转中文星期的转换,走路径2实现
路径2:业务层提前转换(数据库兼容性更好)
在业务代码中先完成日期转星期的逻辑,再把转换后的值作为参数传入SQL,不需要依赖数据库的日期函数,后续换数据库也不需要调整逻辑。
Java 8+ 示例代码:
// 处理用户输入的日期 LocalDate userDate = LocalDate.parse("2021-11-23"); // getValue返回1=周一、2=周二...7=周日,对齐你存储的operating day编码做适配即可 int weekCode = userDate.getDayOfWeek().getValue(); String searchOneWay = "SELECT `flight #`, `a. time`, `d. time`, `departing airport`, `arriving airport`, `2-let ID` " + "FROM FlightOperatedby JOIN AircraftFlightDates USING(`2-let ID`) " + "WHERE `operating day` = ? "; // 执行查询时把weekCode作为参数传入即可
补充优化建议
- 修正表关联逻辑:当前
FlightOperatedby表没有aircraft #字段,和AircraftFlightDates仅通过2-let ID关联会出现脏数据,建议在FlightOperatedby表补充aircraft #字段,或者新增中间表关联航班和执飞机型的对应关系 - 增加运营周期限制:如果航班是季节性运营,建议在
AircraftFlightDates表新增start_date、end_date字段,筛选时同时判断用户输入的日期在运营周期内,避免查出已停飞的航班
内容的提问来源于stack exchange,提问作者DEBAMITA SAHA
相关产品推荐
相关产品推荐

