【问题标题】:Make date variable in a oracle query using VBA使用 VBA 在 oracle 查询中创建日期变量
【发布时间】:2020-10-28 07:45:21
【问题描述】:

首先我很抱歉英语不好,但我会尽力而为。

我有一个在 VBA 宏中运行的 oracle 查询,我需要将 sql 选择中的日期设置为与工作表单元格相关的变量,我已经设法使 sql 咨询工作。

非常感谢您对此的帮助,我真的被困住了,工作代码失败了。

Private Sub cmdConexaoBD_Click()

Dim sql As String
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim i As Integer

'define a conexão com o banco de dados
Set cn = New ADODB.Connection

cn.CursorLocation = adUseClient

cn.Open "Driver={Microsoft ODBC for Oracle}; " & _
"CONNECTSTRING=database;uid=username;pwd=password;"

Set rs = New ADODB.Recordset

sql = "SELECT NUMOS,MIN(DTINICIOOS),MAX(DTFIMOS),MAX(DTFIMOS)-MIN(DTINICIOOS) FROM PCMOVENDPEND WHERE DATA >= TRUNC(SYSDATE) GROUP BY NUMOS"

rs.Open sql, cn

Range("A1").Value = "OS"
Range("B1").Value = "DT"
Range("C1").Value = "DT"
Range("D1").Value = "TEMPO"

i = 1

If Not rs.EOF Then

Do While Not rs.EOF

Range("A" & i + 1).Value = rs(0)
Range("B" & i + 1).Value = rs(1)
Range("C" & i + 1).Value = rs(2)
Range("D" & i + 1).Value = rs(3)
rs.MoveNext
i = i + 1

Loop

End If

cn.Close

End Sub

WHERE DATA >= TRUNC(SYSDATE)“DATA”实际上是日期(葡萄牙语),我想将日期设置为引用工作表单元格的变量,所以我可以在电子表格中更改它并导入此类数据日期而不更改代码。

我希望我说清楚了,谢谢!

【问题讨论】:

  • 显示数据类型和sysdate值类型会很好。
  • "DATA" 实际上是日期(它是葡萄牙语) 是自相矛盾的。 DATE 值没有任何格式或语言,它存储为内部字节值。您看到的是(默认)display 格式/语言。那么DATA列的数据类型是什么?

标签: sql excel vba oracle date


【解决方案1】:

例如:

Dim dt

dt = format(Range("F1").Value,"mm/dd/yyyy")  'your date is in F1

sql = " SELECT NUMOS,MIN(DTINICIOOS),MAX(DTFIMOS),MAX(DTFIMOS)-MIN(DTINICIOOS) " & _
      " FROM PCMOVENDPEND " & _ 
      " WHERE DATA >= to_date('" & dt & "','mm/dd/yyyy') GROUP BY NUMOS "

【讨论】:

  • GREAT 实际上我设法将 SQL 代码作为引用工作表单元格的变量并将 sql 查询放在那里,但我并不满意,感谢您的回答。
【解决方案2】:

最好使用绑定变量,所以你需要这样的东西:

Set dbADOCommand = New ADODB.Command 
Set dbADOParameter = New ADODB.Parameter 

sql = "SELECT NUMOS,MIN(DTINICIOOS),MAX(DTFIMOS),MAX(DTFIMOS)-MIN(DTINICIOOS) FROM PCMOVENDPEND WHERE DATA >= :bindDate GROUP BY NUMOS"

dbADOCommand.CommandText = sql
dbADOCommand.CommandType = adCmdText 
dbADOCommand.NamedParameters = true 
dbADOCommand.Prepared = true 


Set dbADOParameter = dbADOCommand.CreateParameter("bindDate", _ 
                                                  ADODB.DataTypeEnum.adDBDate, _ 
                                                  ADODB.adParamInput, _ 
                                                  8, _ 
                                                  "2020-01-01")
dbADOCommand.Parameters.Append dbADOParameter 

Set dbADORecordSet = New ADODB.Recordset
Set dbADORecordSet = dbADOCommand.Execute

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 2014-10-04
    • 1970-01-01
    相关资源
    最近更新 更多