使用Get Data>From External Source>From Microsoft Query导出数据不正确
Excel跨表查询时间列返回默认值问题排查方案
核心原因
这类问题90%以上是Excel查询驱动(ACE/Jet OLEDB/ODBC)的列类型自动推断机制导致:驱动默认仅扫描列前8行数据判断列数据类型,如果前8行存在空值、文本格式的时间、混合类型值,会错误映射列类型,导致时间值被错误解析为基准默认时间(通常是1899-12-30 00:00:00这类序列值为0的默认时间),后续修改单元格格式无法修正已经读错的底层值。
排查解决步骤
- 修复驱动类型推断规则
打开注册表编辑器,定位到对应Office版本的ACE引擎配置路径:
32位Office装在64位系统的路径是HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Office\[你的Office版本号]\Access Connectivity Engine\Engines\Excel
64位Office的路径是HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\[你的Office版本号]\Access Connectivity Engine\Engines\Excel
(版本号对应:Office2016/2019/2021/365为16.0,Office2013为15.0,Office2010为14.0)
找到TypeGuessRows项,将默认值8改为0(代表扫描全列判断类型),再找到ImportMixedTypes项,将默认值Text改为Majority Type,修改完成后重启Excel重新执行查询即可。 - 无注册表修改权限的临时方案
回到源工作表,在出问题的两列前8行的空单元格中,填入和其他行格式一致的标准时间值,确保前8行没有文本格式的假时间、没有空值,执行查询导入完成后,再删除之前填入的临时值即可。 - 查询语句显式指定类型转换
由于列名包含#特殊字符,可能干扰驱动的类型自动映射,可以在查询中显式做时间类型转换,修改后的查询语句如下:
如果执行时提示类型转换错误,先回到源工作表,对这两列执行「分列」操作,第三步列格式选「时间」,把列内所有文本存储的假时间批量转为真正的时间序列值,再执行查询。SELECT dataForAZDHS.F38, CDate(dataForAZDHS.`0#023611111111`) AS TargetTimeCol1, CDate(dataForAZDHS.`0#036111111111`) AS TargetTimeCol2 FROM dataForAZDHS WHERE dataForAZDHS.PS IN ('P','F') - 导入阶段手动固定列类型
如果是通过Microsoft Query/Power Query导入数据,不要等数据加载完成再改格式,在查询编辑阶段就手动选中这两列,将数据类型指定为「时间」,跳过自动类型检测步骤,加载后的值就会和源表一致。
注意:数据导入完成后再修改单元格格式无效,因为此时驱动已经把源值错误解析成了默认时间的序列值,格式修改只能改变显示样式,无法修正错误的底层数值,必须在查询/导入阶段解决类型映射问题。
内容的提问来源于stack exchange,提问作者Dav1497
相关产品推荐
相关产品推荐

