ADO MAX时间查询

时间:2014-03-11 22:59:01

标签: sql excel vba ado

我正在使用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'

这可以改写,所以不包括单引号吗?请注意,没有结束语。

2 个答案:

答案 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&时间。

到目前为止似乎有效。