VBA – 多个AND语句不起作用的查询

我很难从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语句上使用更less的字段尝试获得一些结果,但是我需要它们来完成这个任务结果为我工作。 奇怪的是,如果我在像Oracle Sql Developer这样的问题中运行相同的查询(在连接到数据库之后),它会显示我想要的结果。 我真的可以用一些帮助,谢谢!

如果您打算对date范围进行硬编码,假设announcement_date是一个date ,那么您需要比较date而不是string。 您可以使用to_date与明确的格式掩码将string转换为date,

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

或者可以使用总是具有格式YYYY-MM-DD的date文字

 sta.announcement_date >= date '2015-01-01' 

我的猜测是你的代码似乎在SQL Developer中工作,因为你恰好在SQL Developer中将你的NLS_DATE_FORMATconfiguration为“DD-Month-YYYY”。

实际上,你应该使用绑定variables,而不是像date范围那样对事物进行硬编码。 假设你绑定了一个date值,从string到date的转换(如果有的话)将发生在VB中,并且不依赖于你的会话的NLS设置。 还有性能和安全的原因喜欢绑定variables。