带WHERE AND条件的SQL SELECT查询无法正常返回匹配记录问题
问题原因
- 最常见的原因是
DateOfHoliday实际为文本类型而非日期类型:虽然字段值看起来是MM/DD/YYYY格式的日期,但文本比较是逐位按字符ASCII码排序,9/28/2021作为文本和11/29/2021比较时,首位9的ASCII码远大于1,会被判定为9/28/2021 > 11/29/2021,不满足<=条件。 - 变量实际值异常:代码运行过程中
d2被后续逻辑修改为早于d1的日期,导致日期范围无效。 - 日期隐含时间冲突:如果
DateOfHoliday字段存储了时间部分,或者d2带时间部分,可能出现边界值超出范围的问题(该问题对你的测试记录影响概率较低,属于通用日期查询常见坑)。
解决方案
- 先验证SQL本身有效性:把Debug.Print输出的SQL语句复制到Access查询的SQL视图直接运行,如果可以返回正确记录,说明问题出在VBA执行逻辑,检查
d1、d2变量后续是否被修改、SQL执行对象的配置是否正确。 - 修正字段类型或转换逻辑:
打开表设计视图,确认DateOfHoliday的类型为「日期/时间」,如果是短文本类型,要么修改字段类型,要么在查询时转换为日期再比较:sqlStr = "SELECT * FROM Table1 WHERE CDate(DateOfHoliday) >= #" & d1 & "# AND CDate(DateOfHoliday) <= #" & d2 & "#" - 优化日期拼接逻辑,规避格式解析问题:
拼接日期时强制格式为ISO标准格式,避免系统区域设置变动导致日期解析错误,也可以用BETWEEN简化语法:' 方案A:用BETWEEN+标准化日期格式 sqlStr = "SELECT * FROM Table1 WHERE DateOfHoliday BETWEEN #" & Format(d1, "yyyy-mm-dd") & "# AND #" & Format(d2, "yyyy-mm-dd") & "#" ' 方案B:如果字段带时间部分,查询d2全天数据用如下写法 sqlStr = "SELECT * FROM Table1 WHERE DateOfHoliday >= #" & Format(d1, "yyyy-mm-dd") & "# AND DateOfHoliday < #" & Format(DateAdd("d", 1, d2), "yyyy-mm-dd") & "#" - 最佳实践:使用参数查询替代字符串拼接,既避免SQL注入风险,也完全不需要处理日期格式适配问题:
Dim cmd As New ADODB.Command cmd.ActiveConnection = 你的数据库连接对象 cmd.CommandText = "SELECT * FROM Table1 WHERE DateOfHoliday >= ? AND DateOfHoliday <= ?" cmd.Parameters.Append cmd.CreateParameter(, adDate, adParamInput, , d1) cmd.Parameters.Append cmd.CreateParameter(, adDate, adParamInput, , d2) Dim rs As ADODB.Recordset Set rs = cmd.Execute
内容的提问来源于stack exchange,提问作者jenshon
相关产品推荐
相关产品推荐

