我很难尝试从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这样的问题中运行相同的查询(在连接到数据库之后),它会显示我想要的结果。我真的可以使用一些帮助,谢谢!
答案 0 :(得分:2)
如果您要对日期范围进行硬编码,假设announcement_date
为date
,则您希望与日期进行比较,而不是字符串。您可以使用带有显式格式掩码的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设置。优选绑定变量还有性能和安全性原因。