Access前端对接SQL Server后端后DMax函数忽略日期筛选条件问题
问题根因
- 核心差异:Access本地数据库使用
#作为日期定界符,后端迁移到SQL Server后,DMax函数生成的筛选条件会提交给SQL Server解析,而SQL Server不识别#作为日期定界符,导致筛选条件失效,最终返回全表最大的月末日期。 - 潜在风险:直接拼接日期字符串未做格式统一,易受系统区域设置影响,导致SQL Server日期解析错误。
解决方案
方案1:调整DMax筛选条件写法
将日期定界符改为SQL Server支持的单引号,同时将日期格式化为yyyy-mm-dd的通用格式,避免区域兼容问题,修改后的代码如下:
If Weekday(Now()) < 3 Then NextSunday = DateAdd("d", 1 - Weekday(Now()), Date) Else NextSunday = DateAdd("d", 8 - Weekday(Now()), Date) End If ' 仅修改DMax行的条件拼接逻辑 nextMonthEnd = DMax("[Month End Date]", "[Month End]", "[Month End Date] < '" & Format(NextSunday, "yyyy-mm-dd") & "'")
方案2:使用原生T-SQL查询(兼容更复杂场景)
如果调整后仍存在语法转换问题,可以直接通过ADODB执行SQL Server原生查询,绕过Access函数的语法转换层:
Dim conn As ADODB.Connection Dim rs As ADODB.Recordset Set conn = CurrentProject.Connection Set rs = conn.Execute("SELECT MAX([Month End Date]) AS max_month_end FROM [Month End] WHERE [Month End Date] < '" & Format(NextSunday, "yyyy-mm-dd") & "'") If Not rs.EOF Then nextMonthEnd = rs!max_month_end End If rs.Close Set rs = Nothing Set conn = Nothing
内容的提问来源于stack exchange,提问作者BWhite
相关产品推荐
相关产品推荐

