2016-01-24 78 views
0

我有一个excel,我用select读取dbf文件。我想从每个code_id中选择最后的日期时间。vba excel datetime innerjoin

Code_id daytime 
1 12-01-2016 9:58:12 
1 12-01-2016 10:01:12 
2 12-01-2016 10:54:01 
2 12-01-2016 11:01:01 

一个结果我得到:

1 12-01-2016 9:58:12 
2 12-01-2016 11:01:01 

我想结果是:

1 12-01-2016 10:01:12 
2 12-01-2016 11:01:01 

似乎有一个问题,当时间从09到10,因为如果时间从去10到11或11到12我得到最后一次,但是当时间从9到10时,它获得最后一次9而不是时间10

是我的代码有问题吗?

SELECT b.code_id, COUNT(*) AS cnt, b.name, 
b.type, a.tp 
FROM " & Filename & " b 
INNER JOIN (select code_id, MAX(daytime) AS tp 
FROM " & Filename & " group by code_id) a 
ON a.code_id = b.code_id 
where DateValue(daytime) <= Date() 
group by b.code_id, b.name, 
b.type, a.tp 
order by b.code_id 
+0

在我看来,日期时间不被认为是这样,而是作为一个简单的文本。并且在一个文本内比较9是在1之后。那是9:58:12(作为文本比较)在10:01:12之后。您需要将其转换为日期时间或在9之前添加0。 – Ralph

+0

如何转换字段? – dave

+0

您必须要求Excel进行转换。正如你所说,dbf只能按原样读取。所以,你首先必须(1)导入整个数据,然后(2)重新格式化它,以便识别日期和时间,然后你可以(3)按照上面的语句中所示将它分组到你喜欢的位置。要将文本转换为日期和时间,可以使用'CDate()',如下例所示:http://stackoverflow.com/questions/20375233/excel-vba-convert-text-to-date – Ralph

回答

0

从您的描述看来,白天字段存储为文本,而不是真正的日期时间字段。由于时间部分绝对不存储前导0,如09,因此数据库比较字母9和字母1,而9更高。

可能的解决方案:

  1. 更改白天是一个真正的日期时间字段。
  2. 将其保留为文本,但要确保日期和时间组件都以前导0存储。
  3. 将sql中的daytime字段转换为日期。
+0

1.无法将白天更改为真正的字段,dbf是由其他程序创建的。 2.also。 3.如何掩盖该领域? – dave

+0

这取决于您用来连接到dbf文件的驱动程序。通过在因特网上搜索,很容易找到该功能。 – Shadow

+0

OLEDB,那里没有工作功能 – dave