系统日期格式为dd/mm/yyyy时如何在Access中按日期字段筛选
问题根因
你的代码存在两处容易触发区域格式冲突的逻辑:
- 你将
Format()输出的字符串直接传给了DateAdd()函数:Format()返回的是文本类型,Access会自动尝试用当前系统的区域日期格式把这段文本解析为日期类型再做计算,dd/mm/yyyy格式的系统下就会出现月日颠倒的问题。 - Jet/ACE数据库引擎本身的日期解析默认优先采用
mm/dd/yyyy的美国格式,即使你格式化输出了yyyy-mm-dd,部分旧版本Access在特定区域设置下仍然可能出现解析异常。
Access本身完全支持dd/mm/yyyy格式,不需要强制修改用户的系统日期设置,按以下方案调整代码即可解决。
修复方案1:调整日期拼接逻辑(最快捷)
先把表单输入的控件值转换为日期类型,完成日期计算后,再统一格式化为SQL引擎可无歧义识别的日期字符串:
Dim str As String Dim dtFrom As Date Dim dtTo As Date ' 先把控件值转为日期类型,不涉及字符串解析,不会受区域格式影响 dtFrom = CDate(From_Date.Value) dtTo = CDate(To_Date.Value) ' 格式化为无歧义的 日-月份缩写-年 格式,不管系统区域如何都不会解析错误 str = "DateCreated BETWEEN #" & Format(dtFrom, "dd mmm yyyy") & "# AND #" & Format(DateAdd("d", 1, dtTo), "dd mmm yyyy") & "#" DoCmd.OpenReport "report_name", acViewReport, WhereCondition:=str
如果你更习惯用yyyy-mm-dd格式,也可以直接替换上述Format的格式参数,只要确保格式化的输入是日期类型而非字符串即可。
修复方案2:使用参数查询(更安全,无注入风险)
如果不想处理日期拼接的格式问题,可以直接用参数查询传递筛选条件,完全避开日期格式解析的问题:
- 先创建一个参数查询,命名为
qry_ReportFilter,SQL内容如下:
PARAMETERS [prm_From] DateTime, [prm_To] DateTime; SELECT * FROM 你的报表数据源表名 WHERE DateCreated BETWEEN [prm_From] AND DateAdd("d",1,[prm_To]);
- 修改VBA代码给参数赋值后打开报表:
Dim qdf As DAO.QueryDef Set qdf = CurrentDb.QueryDefs("qry_ReportFilter") qdf.Parameters("prm_From") = From_Date.Value qdf.Parameters("prm_To") = To_Date.Value ' 把查询绑定到报表的数据源,直接打开即可 Reports!report_name.RecordSource = "qry_ReportFilter" DoCmd.OpenReport "report_name", acViewReport
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

