0

我有一个从 Oracle 数据库中捕获的 .csv 文件。.csv 文件中的日期采用 Oracle 内部格式(不知道它叫什么,因为我不熟悉 Oracle)。看起来像16474

当我在我们用于访问数据库的应用程序中查看该日期时,日期为2/6/2013.

但是,当我将 .csv 文件导入 Excel 并将列格式设置为短日期时,日期显示为2/6/1945

我做了一个随机抽样,看起来月/日总是正确的,但年份相差 68 年。我假设这是因为 Oracle 的“时间开始”不同于 Excel 的“时间开始”

有什么办法可以解决这个问题,以便在将 Oracle 数据导入 Excel 时正确显示日期?

我无权访问 Oracle 方面的任何内容......只有 .csv 文件和 Excel。如果有帮助,我最终也会将 Excel 文件导入 Access。

到目前为止,我在 Excel 中将 Oracle 日期格式化为短日期,并在我的日期列 (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
4

1 回答 1

2

看来甲骨文可能会在 1968 年 1 月 1 日开始。我不是数据库专家,但我认为这个数字在我读过的其他读物中听起来很熟悉。

如果上述假设 1/1/1968 为真,则下面是一个将 Oracle 日期转换为 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 日期的更多信息:

Excel 将序列日期存储为“表示自 1900 年 1 月 0 日以来的天数的数字,加上 24 小时日的小数部分:ddddd.tttttt。这称为序列日期或序列日期时间。”

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

于 2013-03-28T14:45:34.400 回答