python - 将数据从 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
函数已经返回一个 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
祝你好运。
推荐阅读
- vba - vba scrape html - 获取具有动态类的元素
- user-interface - 在 Tkinter GUI 中嵌入散景和大数据
- javascript - 在 JavaScript 中使用 setInterval 循环时如何让精灵停止移动
- javascript - 选中复选框时,如何将表单控件的所有值传递给另一个表单?
- android-studio - 如何在 Google Play 音乐中添加浮动活动,例如“正在播放音乐”
- r - 为什么这段代码使用 == 和 | 运算符的结果为 TRUE
- php - 将 MySQL 表数据插入 PHP 数组
- java - 按下按钮时画线 Swing
- asp.net-mvc - 在与 Azure AD B2C 集成的网站中获取访问令牌
- angular7 - 发布到 IIS 时启动 NPM 失败