SQL Server中Between日期条件不生效,查询无结果求助
排查查询返回0行的可能原因
我来帮你梳理下可能导致查询没返回预期高亮行的几个常见问题:
1. 日期转换或区间的隐性问题
你在查询里对日期字段和输入字符串都做了cast(xxx as date)转换,但这里可能有两个容易忽略的点:
- 如果
ScheduleStartDate/ScheduleEndDate是带时间的类型(比如datetime),转成date本身没问题,但要确认高亮行的日期区间是不是真的包含2018-04-05或2018-04-11。比如假设高亮行的ScheduleEndDate是2018-04-10 23:59:59,转成date后是2018-04-10,那2018-04-11就不在区间内;如果ScheduleStartDate是2018-04-06,那2018-04-05也不在区间里,自然查不到。 - 部分数据库对日期字符串的解析依赖默认格式,如果你的数据库默认日期格式不是
yyyy-MM-dd,cast('2018-04-05' as date)可能会被错误解析(比如当成2018-05-04),导致匹配失败。可以试试用数据库原生的日期构造函数代替字符串转换,比如SQL Server用DATEFROMPARTS(2018,4,5),MySQL用STR_TO_DATE('2018-04-05','%Y-%m-%d')。
2. 字符串字段的精确匹配问题
- FlightNumber:你查询的是
FlightNumber='0004',但要确认高亮行的FlightNumber是不是真的是带前导零的0004——会不会存储的是不带零的4?或者字段前后有隐藏空格(比如' 0004'或'0004 ')?这种情况下精确匹配会直接失败。可以先试试模糊查询FlightNumber LIKE '%0004%'或者去空格后匹配LTRIM(RTRIM(FlightNumber))='0004'来验证。 - CarrierCode:如果你的数据库使用了区分大小写的排序规则(比如SQL Server的
CS排序),那CarrierCode='SQ'和CarrierCode='sq'是不匹配的。可以改成LOWER(CarrierCode)='sq'来排除大小写问题。
3. 简化查询逐步定位问题
建议把查询拆解开调试,快速定位问题点:
- 先执行
select * from Flt_OperativeFlight_SchedulePeriods where CarrierCode='SQ' and FlightNumber='0004',看看能不能查到那行高亮数据。如果查不到,说明是CarrierCode或FlightNumber的匹配问题; - 如果能查到,再查看这行数据的
ScheduleStartDate和ScheduleEndDate的实际值,手动判断是否包含2018-04-05或2018-04-11; - 最后再把日期条件加回去测试,确认是哪个条件导致了匹配失败。
内容的提问来源于stack exchange,提问作者Santosh Jadi
相关产品推荐
相关产品推荐

