我正在尝试通过执行以下代码来导入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)
预期:具有所有数据行的数据框
实际:具有所有标题但没有数据行的数据框
答案 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
好运。