使用UNION Select查询时MS Access无法按日期范围筛选
解决Access UNION查询日期范围筛选异常问题
核心问题原因
你用Format函数把日期字段转换成了字符串类型,字符串的比较逻辑和原生日期类型完全不同。比如字符串"10/05/2023"会被当成文本排序,和"09/30/2023"比较时,"10"开头的字符串会被判定为更大,但实际日期上09/30比10/05早,这就导致范围筛选结果混乱。单个日期筛选能正常工作,是因为单个字符串匹配刚好能对应上,但范围比较就彻底失效了。
解决步骤
移除UNION查询中的Format函数
保留日期字段的原生日期/时间类型,不要做格式转换。修改后的基础UNION查询如下:SELECT "Argentina" as Country, [Argentina - Immediate Refund].[Date sent], [Argentina - Immediate Refund].[Received date], [Argentina - Immediate Refund].[Released date], [Argentina - Immediate Refund].[Processed Forms] FROM [Argentina - Immediate Refund] UNION ALL SELECT "Austria" as Country, [Austria - Immediate Refund].[Date sent], [Austria - Immediate Refund].[Received date], [Austria - Immediate Refund].[Released date], [Austria - Immediate Refund].[Processed Forms] FROM [Austria - Immediate Refund];用Access标准语法写日期范围筛选
Access中日期必须用#包裹,推荐用YYYY-MM-DD格式,避免因系统区域设置的日期格式差异导致识别错误。如果要筛选2023年10月1日至11月1日的记录,分两种情况:- 如果日期字段不带时间(仅日期):
SELECT * FROM ( -- 上面的UNION查询内容 ) AS CombinedData WHERE [Date sent] BETWEEN #2023-10-01# AND #2023-11-01#; - 如果日期字段包含时间:
直接用BETWEEN会漏掉11月1日当天非0点的记录,需明确指定时间范围:SELECT * FROM ( -- 上面的UNION查询内容 ) AS CombinedData WHERE [Date sent] >= #2023-10-01# AND [Date sent] <= #2023-11-01 23:59:59#;
- 如果日期字段不带时间(仅日期):
检查子表日期字段类型
如果子表中的Date sent等字段是文本类型而非日期/时间类型,即使去掉Format也无法正确比较。这种情况下:- 优先修改表结构,把字段类型改成
日期/时间; - 若无法改表结构,在UNION查询中用
CDate函数转换类型:SELECT "Argentina" as Country, CDate([Argentina - Immediate Refund].[Date sent]) AS [Date sent], [Argentina - Immediate Refund].[Received date], [Argentina - Immediate Refund].[Released date], [Argentina - Immediate Refund].[Processed Forms] FROM [Argentina - Immediate Refund] UNION ALL SELECT "Austria" as Country, CDate([Austria - Immediate Refund].[Date sent]) AS [Date sent], [Austria - Immediate Refund].[Received date], [Austria - Immediate Refund].[Released date], [Austria - Immediate Refund].[Processed Forms] FROM [Austria - Immediate Refund];
注意:转换前提是文本字段的内容是合法的日期格式,否则会报错。
- 优先修改表结构,把字段类型改成
内容的提问来源于stack exchange,提问作者Marek Baranko
相关产品推荐
相关产品推荐

