Excel 从 SQL 导入数据 - 日期以文本值形式出现

Posted

技术标签:

【中文标题】Excel 从 SQL 导入数据 - 日期以文本值形式出现【英文标题】:Excel Import Data from SQL- Date comes in as text value 【发布时间】:2015-06-09 11:22:11 【问题描述】:

我正在使用数据连接将数据从 oracle toad 数据库导入 Excel 工作表。该表包含一个日期列,但此列作为文本而不是日期出现在 Excel 中。

有什么办法可以解决这个问题吗?

Sub Show_data()


    Dim con As ADODB.Connection
    Dim recset As ADODB.Recordset
    Dim ConnectionString As String
    Dim strSQL As String
    Dim iCols As Integer


    Set con = New ADODB.Connection
    Set recset = New ADODB.Recordset

'Check for the connectivity or connected to the xx network
    On Error GoTo errHandler


    ConnectionString = "Provider=xx;User ID=yy;password= appsro;Data Source=zz"

    con.Open ConnectionString

    'Set and Excecute SQL Command'

        strSQL = "SELECT B.USER_NAME AS CREATED_BY, A.CREATION_DATE, C.USER_NAME, A.LAST_UPDATE_DATE, A.PFIZER_ITEMCODE, A.SYSTEM_ITEMCODE AS ORACLE_ITEM_CODE, " & _
        "A.ITEM_DESCRIPTION, A.BATCH_NUMBER, A.MFR_CODE, A.MFR_DESC AS MFR_DESCRIPTION, TO_CHAR(A.MFR_DATE,'DD-MON-YYYY')As MFR_DATE, TO_CHAR(A.EXPIRY_DATE,'DD-MON-YYYY')As EXPIRY_DATE, " & _
        "TO_CHAR(A.EFFECTIVE_FROM,'DD-MON-YYYY') AS EFFECTIVE_FROM, " & _
        "A.EFFECTIVE_TO, A.EXCISE AS EXCISE_AMOUNT, A.EXCISE_RATE, A.P2S, A.P2R, A.MRP, A.STATE_CODE, A.STATE, " & _
        "(CASE SUBSTR(A.SYSTEM_ITEMCODE,6,2) WHEN ('PI') THEN 'OIP' WHEN ('PF') THEN 'OPF' ELSE 'OWL' END )AS LEGAL_ENTITY " & _
        "FROM xxdhl_pf_batch_pricing A JOIN fnd_user B ON A.CREATED_BY = B.USER_ID " & _
        "JOIN fnd_user C ON A.LAST_UPDATED_BY = C.USER_ID WHERE "


        If (ActiveSheet.cmbLE.Text) <> "" Then
        strSQL = strSQL & " (CASE SUBSTR(A.SYSTEM_ITEMCODE,6,2) WHEN ('PI') THEN 'OIP' WHEN ('PF') THEN 'OPF' ELSE 'OWL' END )='" & ActiveSheet.cmbLE.Text & "'"
        End If

        If (ActiveSheet.cmbProduct.Text) <> "" Then
            If (ActiveSheet.cmbLE.Text) <> "" Then
                strSQL = strSQL & " AND A.SYSTEM_ITEMCODE='" & ActiveSheet.cmbProduct.Text & "'"
            Else
                strSQL = strSQL & " A.SYSTEM_ITEMCODE='" & ActiveSheet.cmbProduct.Text & "'"
            End If
        End If

        If (ActiveSheet.txtBatch.Text) <> "" Then
            If (ActiveSheet.cmbLE.Text) <> "" Or (ActiveSheet.cmbProduct.Text) <> "" Then
                strSQL = strSQL & " AND A.BATCH_NUMBER='" & ActiveSheet.txtBatch.Text & "'"
            Else
                strSQL = strSQL & " A.BATCH_NUMBER='" & ActiveSheet.txtBatch.Text & "'"
            End If
        End If

        If (ActiveSheet.txtfromdt.Text) <> "" Then
            If (ActiveSheet.txtfromdt.Text) <> "" And (ActiveSheet.txtTodt.Text) <> "" Then

            Else
                strSQL = strSQL & " AND TRUNC(A.EFFECTIVE_FROM) BETWEEN TO_DATE('" & ActiveSheet.txtfromdt.Text & "','DD-MON-YYYY') AND TO_CHAR(SYSDATE ,'DD-MON-YYYY') "
            End If
        End If

        If (ActiveSheet.txtfromdt.Text) <> "" And (ActiveSheet.txtTodt.Text) <> "" Then
            If (ActiveSheet.cmbLE.Text) <> "" Or (ActiveSheet.cmbProduct.Text) <> "" Or (ActiveSheet.txtBatch.Text) <> "" Then
                strSQL = strSQL & " AND TRUNC(A.EFFECTIVE_FROM) BETWEEN TO_DATE('" & ActiveSheet.txtfromdt.Text & "','DD-MON-YYYY') AND TO_DATE('" & ActiveSheet.txtTodt.Text & "','DD-MON-YYYY') "
            Else
                strSQL = strSQL & " TRUNC(A.EFFECTIVE_FROM) BETWEEN TO_DATE('" & ActiveSheet.txtfromdt.Text & "','DD-MON-YYYY') AND TO_DATE('" & ActiveSheet.txtTodt.Text & "','DD-MON-YYYY') "
            End If
        End If



    'Open Recordset

    Set recset.ActiveConnection = con
    If recset.State = adStateOpen Then recset.Close
    recset.CursorLocation = adUseClient
    recset.Open strSQL, con, adOpenKeyset, adLockOptimistic

    For iCols = 0 To recset.Fields.Count - 1
        Worksheets("Sheet2").Cells(1, iCols + 1).Value = recset.Fields(iCols).Name
    Next

    'Copy the data
    If recset.RecordCount > 0 Then
    Sheets("Sheet2").Range("A2").CopyFromRecordset recset
    Else
    MsgBox "No Data Available", vbExclamation + vbOKOnly, ""
    Exit Sub
    End If




recset.Close
con.Close


errHandler:
    If Err.Number = -2147467259 Then
        MsgBox "Please check for the xx connectivity ", vbExclamation + vbOKOnly
        Exit Sub
    End If

End Sub

实际结果 - 2015 年 6 月 5 日下午 4:12:47 但在 Excel 中 - 42160.67554

请帮忙:(

【问题讨论】:

它是正确的 - 您的 Excel 值是正确的日期,没有格式化。您需要在 SQL 代码或 VBA 代码中或在 Excel 中手动应用所需的日期格式。 @KazimierzJawor....嗨,请给任何例如通过代码来做 在 SQL 和 VBA 中检查 Format functions。我看不出您在解决方案中使用 VBA 的方式。显示您的 VBA 代码以获得进一步的支持。 @KazimierzJawor..您好我已经编辑了我的代码...请检查你是否能找到任何东西。 在我看来,你所需要的只是@joehanna 的回答。 【参考方案1】:

您指的是哪些列,因为您在 SQL 查询中涉及日期时有多种逻辑。

CREATION_DATELAST_UPDATE_DATE 应该可以正常工作,只需要像@KazimierzJawor 所说的那样进行格式化。类似的东西:-

  Range("B5:B10, D5:D10").NumberFormat = "m/d/yyyy h:mm:ss AM/PM"

如果您指的是MFR_DATEEXPIRY_DATEEFFECTIVE_FROM 列,那么您应该删除TO_CHAR 函数,因为这会强制数据为文本。删除函数后,您应该能够使用与上述相同的技术来格式化这些列。

【讨论】:

@joe...以上是您提供的简单解决方案,并为此感谢...但是在我的 VBA 中编码看起来很糟糕。我已经编辑了我的完整编码......请检查并让我知道是否有任何其他方式...... @KalpeshKoli,“糟糕的编码”是什么意思?乔汉娜的答案是你应该尝试申请的。 @KazimierzJawor....嘿,抱歉选择了错误的词,但我正在考虑不同的解决方案来格式化记录集的数据。但是我只会有这个解决方案,同时检查是否有其他解决方案..

以上是关于Excel 从 SQL 导入数据 - 日期以文本值形式出现的主要内容,如果未能解决你的问题,请参考以下文章

java代码怎么实现 excel导入的文本值转换成日期

把excel导入sql server数据库日期类型变成科学计数法怎么办

从 SQL 导入后 Excel 无法识别数字单元格

从 Reporting Services 导入时在 Excel 中按日期排序

SQL Server 导入导出向导 - 日期时间错误 - 特定值

SharePoint 列表数据的 Excel Power Query 导入更改日期/时间值