2013-07-26 43 views
1

我從PICK/UniVerse數據庫中獲取一些數據,其中包含4或5個字符數字格式的日期。下面是一些例子..我抓住從數據庫中日期值,並與它的日期被顯示在應用程序中:如何將內部數字日期轉換爲訪問日期/時間格式?

9832  12/1/1994 
10027  6/14/1995 
10594  1/1/1997 

是否有可能將這些轉換成一些可以投入Access作爲日期/時間值?

作爲一項測試,我把Excel中的9832作爲General格式,然後將其更改爲Short Date,它出現在12/1/1926。所以這已經過去了68年。對於10027和10594也是如此。

+0

你知道41481怎麼樣與7/26/2013相關?這是幾天以來?自從分鐘?如果沒有這些信息,它可能很難,它應該很容易。 –

+0

我使用從數據庫中獲取的實際日期值更新了我的問題,並與應用程序中顯示的日期進行了比較。 –

回答

3

在C#中,你可以使用DateTime.FromOADate

DateTime dt = DateTime.FromOADate(41481); 

返回datetime等同於指定的OLE自動化日期。

這會給你:

dt = {26/07/2013 12:00:00 AM} 

以後你可以插入你的Access數據庫日期。

+0

謝謝..當我這樣做的時候,月份和日子都是正確的,但是這一年已經過去了68年(例如1926年而不是1994年)。它看起來像我需要將24837添加到我的值,然後使用DateTime.FromOADate來轉換它們,這應該工作。 –

+0

@ JeffBrady,不客氣,奇怪它已經過去了68年,它的價值'41481' – Habib

+0

41481實際上並沒有在數據庫中..我只是用它作爲例子。我回去並用實際數據更新了我的問題。 –

1

訪問日期/時間值實際上是雙精度浮點數。整數部分表示一天,整數部分表示一天的時間。

看起來這些挑選日期編號直接對應訪問日期/時間值的日期部分。所以你可以使用CDate來改變它們。

? CDate(41481) 
7/26/2013 

試驗一些來感受這個:

? Date() 
7/26/2013 
? CDbl(Date()) 
41481 

注意,雖然你的問題被打上C#中,你不需要那麼做這些轉換。您可以使用Access查詢來執行這些操作,並要求數據庫引擎應用這些功能。

由於事實證明這些日期數字一直偏移了68年,您仍然可以在Access查詢中進行轉換。

? DateAdd("yyyy", 68, CDate(9832)) 
12/1/1994 
? DateAdd("yyyy", 68, CDate(10027)) 
6/14/1995 
? DateAdd("yyyy", 68, CDate(10594)) 
1/1/1997 

或者......

? CDate(9832 + CLng(24837)) 
12/1/1994 
? CDate(10027 + CLng(24837)) 
6/14/1995 
? CDate(10594 + CLng(24837)) 
1/1/1997 
+0

謝謝..我會在查詢過程中檢查這一點。我正在做一個有165個字段的'INSERT',所以它已經非常凌亂了:) –

1

有點遲到這個線程,但我會發布一些更多的細節:Pick/MultiValue DBMS將日期存儲爲日期0 = 12/31/1967的整數。所以當我寫這篇文章在2014年1月16日的內部選擇日期是16818.如果您使用下面你會得到神奇的數字24837:

DateTime.Parse("12/31/1967").Subtract(DateTime.FromOADate(0)).Days 

所以添加到您的選擇日期以獲得OADate。

如果您使用任何常見MV DBMS庫來提取數據(UniObjects,U2.NET,mv.NET ...),則不需要像這樣轉換日期。一個典型的函數可能看起來像:

string date = OConv(record["PurchaseDate"], "d2/"); // "01/16/14" 

或者,而不是在內部DBMS格式提取數據,你真的應該得到它在外部格式啓動。詢問提供數據的DBMS開發人員爲您做這些事情。返回「date'd2 /'」而不僅僅是「date」是很容易的。

如果您需要更多信息,請直接與我聯繫。

相關問題