VBA - 多个AND语句无效的查询

时间:2015-02-03 17:05:06

标签: excel oracle vba excel-vba

我很难尝试从Oracle数据库收集数据。我设法得到连接,所以问题在于查询。目前查询没有返回任何内容,VBA也没有抱怨它。

以下是代码:

Sub Connect_XXXX()

Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
Dim rs As New ADODB.Recordset
Set rs = New ADODB.Recordset
Dim myQuery As ADODB.Command
Set myQuery = New ADODB.Command


conn.Open "Provider=OraOLEDB.Oracle;" & _
          "Data Source=XXXX;" & _
          "User Id=YYYY;" & _
          "Password=ZZZZ"

myQuery.ActiveConnection = conn

myQuery.CommandText = "SELECT sta.index_id, sta.index_action as Action, sta.ticker, sta.company, sta.announcement_date as A_Date, sta.announcement_time as A_Time, " & _
                        "sta.effective_date as E_Date, dyn.index_supply_demand as BS_Shares, dyn.net_index_supply_demand as Net_BS_Shares, dyn.est_funding_trade as BS_Value, " & _
                        "dyn.trade_adv_perc/100 as Days_to_Trade, dyn.pre_index_weight/100 as Wgt_Old, dyn.post_index_weight/100 as Wgt_New, dyn.net_index_weight/100 as Wgt_Chg, " & _
                        "dyn.pre_est_index_holdings as Index_Hldgs_Old, dyn.post_est_index_holdings as Index_Hldgs_New, dyn.net_est_index_holdings as Index_Hldgs_Chg, sta.index_action_details as Details " & _
                        "FROM index_analysis.eq_index_actions_dyn dyn, index_analysis.eq_index_actions_static sta " & _
                        "WHERE (sta.action_id = dyn.action_id) AND (sta.announcement_date=dyn.price_date) AND (sta.announcement_date >= '01-January-2015') AND (sta.announcement_date <= '30-January-2015') " & _
                        "ORDER by sta.index_id,sta.announcement_date"



Set rs = myQuery.Execute

Sheets("Sheet1").Range("A1").CopyFromRecordset rs

rs.Close
conn.Close

End Sub   

我经常使用查询,并且通过删除WHERE之后的一些AND语句并尝试使用SELECT语句中的较少字段,我能够获得一些结果,但是我需要它们才能使这个结果对我有用。奇怪的是,如果我在像Oracle Sql Developer这样的问题中运行相同的查询(在连接到数据库之后),它会显示我想要的结果。我真的可以使用一些帮助,谢谢!

1 个答案:

答案 0 :(得分:2)

如果您要对日期范围进行硬编码,假设announcement_datedate,则您希望与日期进行比较,而不是字符串。您可以使用带有显式格式掩码的to_date将字符串转换为日期

sta.announcement_date >= to_date( '01-January-2015', 'DD-Month-YYYY')

或者您可以使用始终格式为YYYY-MM-DD

的日期文字
sta.announcement_date >= date '2015-01-01'

我的猜测是您的代码似乎在SQL Developer中工作,因为您恰好已将NLS_DATE_FORMAT配置为DD-Month-YYYY&#39;在SQL Developer中。

实际上,你应该使用绑定变量而不是硬编码日期范围之类的东西。假设您绑定了一个日期值,从字符串到日期的转换(如果有的话)将在VB中发生,并且不会取决于您的会话的NLS设置。优选绑定变量还有性能和安全性原因。