从Oracle数据库将数据导入Python环境时

时间:2019-05-03 11:15:05

标签: python python-3.x oracle cx-oracle

我正在尝试通过执行以下代码来导入python的视图表之一。但是问题是通过在oracle SQl开发人员上运行相同的代码,我正在获取数据,但是在执行同一行代码时,我正在获取零行数据(无数据)。该代码已成功执行,并且与Oracle DB的连接也很牢固。 请帮助我如何在python上加载数据

我尝试使用To_Date函数获取结果

import cx_Oracle

cx_Oracle.clientversion()

conn = cx_Oracle.connect('##########')

c = conn.cursor()

querystring1 = "(select * from CP_FALLOUT_VIEW where SCOPE_DT = TO_DATE(sysdate-90))"

df1 = pd.read_sql_query(querystring1, con=conn)

预期:具有所有数据行的数据框

实际:具有所有标题但没有数据行的数据框

1 个答案:

答案 0 :(得分:1)

SYSDATE函数已经返回了DATE值,因此不需要...TO_DATE(sysdate-90)。我也看不出任何理由将整个查询括在括号中。但是,请记住,在Oracle中,DATE实际上是一个时间戳,其中包含年,月,日,小时,分钟和秒的字段。当进行类似SCOPE_DT = SYSDATE - 90之类的比较时,SCOPE_DT值不仅必须匹配SYSDATE中的年/月/日,还必须匹配hours:minutes:seconds。我怀疑你真的想要类似的东西

select *
  from CP_FALLOUT_VIEW
  where TRUNC(SCOPE_DT) = TRUNC(sysdate) - 90

此处TRUNC函数用于截断日期-即将小时:分钟:秒设置为00:00:00,以便我们可以有效地仅比较DATE值的日/月/年部分

但这会很慢,因为我们正在将TRUNC函数应用于视图中的每一行。更好的选择是

SELECT *
  FROM CP_FALLOUT_VIEW
  WHERE SCOPE_DT BETWEEN TRUNC(SYSDATE) - 90
                     AND TRUNC(SYSDATE) - 89

这里您要确定SCOPE_DT是否在SYSDATE-90开始到其后的第二天(SYSDATE-89)之间。但是,即使这样也有一个小问题-因为BETWEEN比较包含其端点,因此它将选择与TRUNC(SYSDATE)-89完全匹配的SCOPE_DT。因此,只包含过去 恰好是90天的日期,并且您可以合理使用

SELECT *
  FROM CP_FALLOUT_VIEW
  WHERE SCOPE_DT BETWEEN TRUNC(SYSDATE) - INTERVAL '90' DAY
                     AND TRUNC(SYSDATE) - INTERVAL '89' DAY - INTERVAL '1' SECOND

好运。