2016-01-24 76 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