首页 > 解决方案 > 将数据从 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)

预期:包含所有数据行的数据框

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

标签: pythonpython-3.xoraclecx-oracle

解决方案


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

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)之间。然而,即使这样也有一个小问题——它会选择一个与 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

祝你好运。


推荐阅读