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



我试图通过执行以下代码来导入查看表o 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)

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

实际:带有所有标题的数据框,但没有数据

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

之类的东西
select *
  from CP_FALLOUT_VIEW
  where TRUNC(SCOPE_DT) = TRUNC(sysdate) - 90

在这里,截断功能用于截断日期 - 即设置小时:分钟:秒至00:00:00-这样我们才能有效地比较日期值的日/月/年份。

但这将很慢,因为我们将截面函数应用于视图中的每个行。更好的选择是

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

在这里,您正在确定scope_dt是否介于sysdate-90的开始和之后的第二天,即sysdate-89。但是,即使是一个小问题 - 它将选择一个与trunc(sysdate(-89完全匹配的scope_dt,因为BETWEEN比较包括其端点。因此,仅包括在过去的90天的日期,您想使用

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

最佳幸运。

最新更新