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

带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带时间部分,可能出现边界值超出范围的问题(该问题对你的测试记录影响概率较低,属于通用日期查询常见坑)。
解决方案
  1. 先验证SQL本身有效性:把Debug.Print输出的SQL语句复制到Access查询的SQL视图直接运行,如果可以返回正确记录,说明问题出在VBA执行逻辑,检查d1、d2变量后续是否被修改、SQL执行对象的配置是否正确。
  2. 修正字段类型或转换逻辑:
    打开表设计视图,确认DateOfHoliday的类型为「日期/时间」,如果是短文本类型,要么修改字段类型,要么在查询时转换为日期再比较:
    sqlStr = "SELECT * FROM Table1 WHERE CDate(DateOfHoliday) >= #" & d1 & "# AND CDate(DateOfHoliday) <= #" & d2 & "#"
    
  3. 优化日期拼接逻辑,规避格式解析问题:
    拼接日期时强制格式为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") & "#"
    
  4. 最佳实践:使用参数查询替代字符串拼接,既避免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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:24:04