我正在使用ADO \ ACE.OLEDB查询来访问Excel工作表中的数据。此工作表中的一列是00:00:00格式的时间戳。
我对此列的选择最大查询工作正常,但它返回错误的“最大”时间。例如,如果我有以下时间戳:
8时15分00秒
09:45:00
10:00:00
SELECT MAX查询将返回09:45:00,并忽略任何后续时间戳。如果我转到查询的工作表,并使用文本到列将该列中的所有单元格转换为“时间”,则查询将返回正确的值10:00:00。
excel表中记录的时间戳经常被许多不同的人使用他们自己的ADO Update \ Insert查询更新,所以我不可能打开工作表并手动将单元格转换为正确的类型。 update \ insert查询将单元格类型设置为“常规”。
所以我的问题是这个。
有没有办法要么
A)在update \ insert中指定ADO查询中的数据类型,以便单元格具有正确的数据类型?或
B)强制SELECT MAX查询将列解释为时间值而不是文本?
如果没有关于如何处理的任何建议?
编辑:我仔细查看了我正在查询的Excel表格。我注意到每个单元格前面都有一个单引号。我想如果我可以在记录条目时将其删除,那么excel可能会正确地格式化单元格。 这是一个基本的例子,用于将条目写入工作表。 更新[Sheet1 $]设置StopTime = '09:45:00'WHERE Date ='3/12 / 2014'ANDTime ='9:30:00'这可以改写,所以不包括单引号吗?请注意,没有结束语。
答案 0 :(得分:0)
Excel中单元格开头的单引号强制Excel将单元格值解释为文本。可能正在插入单引号,因为update语句使用单引号,表示字符串。您可能可以使用##
分隔符,具体表示日期/时间值(我说"可能"因为我还没有对此进行测试)。例如:
UPDATE [Sheet1$]
SET StopTime = #09:45:00#
WHERE [...]
另一方面,您可以使用CDate
函数强制将列解释为日期/时间:
SELECT MAX(CDate(StopTime)) AS MaxTime
FROM [Sheet1$]
在这种情况下,您只需要注意无法转换为有效时间的值,这会导致查询出错。
答案 1 :(得分:0)
我甚至没有意识到这一点,但我给出的例子都是有缺陷的。记录的内容不包括前导零。由于我使用24小时的时间,我能够通过在记录的时间内写入前导零来纠正这个问题。
基本上它是一个,如果LEN(时间)= 7那么时间= 0&时间。
到目前为止似乎有效。