2013-03-28 102 views
0

我有一個從Oracle數據庫中捕獲的.csv文件。 .csv文件中的日期採用Oracle內部格式(由於我不熟悉Oracle,因此不確定它的名稱)。它看起來像16474如何在Excel中將Oracle內部日期轉換爲Excel日期?

當我在應用程序中查看該日期時,我們用來訪問數據庫,日期爲2/6/2013

然而,當我導入.csv文件導入Excel和格式化列短日期,它顯示的日期2/6/1945

我做了隨機抽樣,它看起來像在月/日總是正確的,但這一年已經過去了68年。我假設這是因爲Oracle的「開始時間」不同於Excel的「開始時間」

有什麼方法可以解決這個問題,以便在將Oracle數據導入Excel時正確顯示日期?

我沒有訪問Oracle端的任何東西..只是.csv文件和Excel。如果有幫助,我也最終將Excel文件導入到Access中。

到目前爲止,我格式化的Oracle日期在Excel作爲短日期,並插入旁邊一列到我的日期列(J)和使用下列內容:

=DATE(YEAR(J1)+68,MONTH(J1),DAY(J1)) 

我不知道這是100%準確考慮閏年

編輯:我覺得這個代碼可以做到這一點:

Public Sub ReplaceData() 

    Dim RangeCell As Range 

    For Each RangeCell In Selection 

     If IsNumeric(RangeCell.Value) Then 
      lngDate = CLng(RangeCell.Value) 
      RangeCell.Value = DateAdd("d", lngDate - 1, "1/1/1968") 
     End If 

    Next RangeCell 

End Sub 
+1

'csv'不是Oracle格式。此外,'Date'數據類型在Oracle中沒有格式:'date'被轉換爲客戶端詢問何時需要顯示/保存到文件的格式。由於您無法更新導出過程,因此這是100%的Excel問題:) –

+1

@VincentMalgrat - 數據由訪問Oracle數據庫的AccuTerm軟件中的「捕獲」功能捕獲。爲了得到它,我運行了2個命令:'SELECT TABLENAME',然後是'LIST.TAB FIELD1 FIELD2' ..在這個過程中,我可以做的任何事情是將'FIELD2'從'16474'轉換爲'2/6/2013' ? –

+0

我不知道這個工具,你可以添加一個函數到你的列嗎?使用['to_char'](http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions200.htm#SQLRF06129)是在Oracle中指定「日期」格式的標準函數。或者,您可以查詢包含'to_char'轉換的視圖。 –

回答

2

看來,甲骨文可以開始在1968年1月1日。我不是一個數據庫傢伙,但我認爲這個數字在我已經完成的其他閱讀中聽起來很熟悉。

這是一個示例例程,如果上述假設爲1/1/1968爲真,則會將Oracle日期轉換爲Excel日期。有關Excel日期

Sub OracleToExcelCSVDates() 
Dim rng as Range 'range of cells containing dates' 
Dim cl as Range 
Dim strDate As String 'date received from Oracle' 
Dim lngDate As Long 
Dim newDate As Date 'Converted date' 

Set rng = Range("J1:J1000") '< modify this for the number of rows you use in col J' 

For each cl in rng 'Iterate over the rng you defined above.' 
    'Capture the date from Oracle' 
    strDate = cl.Value 
    If Not Trim(strDate) = vbNullString Then 'ignore blanks' 
     'convert to Long data type' 
     lngDate = CLng(strDate) 

     'Add the # of days (lngDate) to Oracles base date of 1/1/1968' 
     newDate = DateAdd("d", lngDate - 1, "1/1/1968") 

     'Overwrite the cell value with the new converted date:' 
     cl.Value = newDate 
    End If 

End Sub 

更多信息:

Excel存儲串行日期爲「代表自1900年以來,揚-0的天數,加上一天24小時的小數部分的數字:DDDDD .tttttt。這稱爲序列日期,或序列日期時間。「

http://www.cpearson.com/excel/datetime

+1

你確定它不是來自unix時代嗎? (1/1/1970) –

+1

不,我不確定。從OP的假設1/16/1968開始。如果是1970年1月1日(或其他任何日期),只需更改'DateAdd'函數中的最後一個參數以與正確的基準日期相對應。 –

+0

謝謝大衛..假設Excel中的日期是J列,你能告訴我你的代碼看起來像轉換列J中的任何值嗎? –

相關問題