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_DATE
和LAST_UPDATE_DATE
应该可以正常工作,只需要像@KazimierzJawor 所说的那样进行格式化。类似的东西:-
Range("B5:B10, D5:D10").NumberFormat = "m/d/yyyy h:mm:ss AM/PM"
如果您指的是MFR_DATE
、EXPIRY_DATE
和EFFECTIVE_FROM
列,那么您应该删除TO_CHAR
函数,因为这会强制数据为文本。删除函数后,您应该能够使用与上述相同的技术来格式化这些列。
【讨论】:
@joe...以上是您提供的简单解决方案,并为此感谢...但是在我的 VBA 中编码看起来很糟糕。我已经编辑了我的完整编码......请检查并让我知道是否有任何其他方式...... @KalpeshKoli,“糟糕的编码”是什么意思?乔汉娜的答案是你应该尝试申请的。 @KazimierzJawor....嘿,抱歉选择了错误的词,但我正在考虑不同的解决方案来格式化记录集的数据。但是我只会有这个解决方案,同时检查是否有其他解决方案..以上是关于Excel 从 SQL 导入数据 - 日期以文本值形式出现的主要内容,如果未能解决你的问题,请参考以下文章
把excel导入sql server数据库日期类型变成科学计数法怎么办
从 Reporting Services 导入时在 Excel 中按日期排序