OLEDB读取CSV时SQL日期过滤出现数据类型不匹配错误求助
问题解决:OLEDB 查询 CSV 时日期过滤的“数据类型不匹配”错误
问题根源
出现该错误的核心原因有两个:
- OLEDB 驱动的日期格式识别问题:Microsoft Jet OLEDB 4.0 默认对日期字面量的格式要求严格,
DD/MM/YYYY格式可能因系统 locale 被误解析为MM/DD/YYYY(如 US 区域设置),导致无效日期或类型不匹配。 - 列数据类型推断错误:驱动会根据 CSV 文件前几行数据自动推断列类型,如果
LastUpdated列存在空值、非日期格式内容,驱动可能将其识别为文本类型,与日期字面量比较时就会报错。
解决方案
方案1:使用无歧义的日期字面量格式
将日期转换为 ISO 标准格式(YYYY-MM-DD)并使用 # 包裹,这种格式不受 locale 影响,能被 Jet OLEDB 正确识别。修改后的 SQL 语句如下:
"SELECT * FROM [" & "1_RPA_GBR_AC_022.csv" & "] T WHERE LastUpdated >= #2023-03-20 00:00:00# AND LastUpdated <= #2023-03-27 00:00:00#"
方案2:通过 schema.ini 文件强制指定列数据类型
这是最可靠的长期解决方案,能彻底避免驱动自动推断类型的问题。在 CSV 文件所在的文件夹中创建名为 schema.ini 的文件,内容如下:
[1_RPA_GBR_AC_022.csv] ColNameHeader=True Format=Delimited(,) Col1=LastUpdated DateTime ; 根据实际情况添加其他列的定义,例如: ; Col2=OtherColumn Text Width=100 ; Col3=NumberColumn Integer
该文件明确告诉 OLEDB 驱动 LastUpdated 列是 DateTime 类型,无论 CSV 内容如何,都会按日期类型处理。
方案3:调整连接字符串参数
在连接字符串的扩展属性中添加日期格式和混合类型处理设置,辅助驱动正确解析日期:
"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & [Extract Folder] & ";Extended Properties='text;IMEX=1;DateTimeFormat=dd/MM/yyyy';"
IMEX=1:强制驱动将混合类型列视为文本(但配合 schema.ini 使用时可省略)DateTimeFormat=dd/MM/yyyy:明确指定日期解析格式为日/月/年
内容的提问来源于stack exchange,提问作者Sean Bailey
相关产品推荐
相关产品推荐

