2019-04-16【Python笔记】查询Oracle数据 条件包含时间时的处理

安装cx_Oracle模块和Oracle客户端:

1.直接使用pip install cx_Oracle在线安装cx_Oralce模块,或者:
从PyPI下载cx_Oralce包后进入包所在目录后用pip install cx_Oracle离线安装。
2.从Oracle官网下载对应操作系统版本的客户端(驱动) instantclient-basic-nt-12.2.0.1.0.zip,直接下完整版,别下精简版,可能会有意想不到的错误。安装方法下载页面上有介绍:把下载的包解压后添加环境变量就可以了。不过同时还需要Visual Studio 2013 redistributable支持,一并安装成功后就可以使用了。


建立Oracle连接 查询数据:

import cx_Oracle     #引用模块cx_Oracle
conn=cx_Oracle.connnet('用户名/密码@IP或者服务器域名:端口号/服务名')    #连接数据库
cursor=conn.cursor()      #获取游标

result=cursor.execute(sql查询字符串)      #使用cursor进行各种操作

data=result.fetchone()           #获取一行数据
data=result.fetchall()           #获取所有数据
data=result.fetchmany(行数)      #获取多行数据

cursor.close()                   #关闭cursor
conn.close()                     #关闭连接

重点来了,查询条件中需要比较一个时间字段的数据,如何编写sql字符串:

假如有下面这个查询
sql='select 字段名 from 数据表名 where occur_time>str_time'
其中occur_time是日期时间型,那么str_time怎么写。

首先这个查询sql是以字符串的形式传给服务器的,因此str_time同样是字符串。
对于这种情况,SQL语名中提供了一个方法to_date(str_time)


实例:查询最近30分钟的数据

#引用模块cx_Oracle和datetime 
import cx_Oracle,datetime  
#连接数据库
conn=cx_Oracle.connnet('用户名/密码@IP或者服务器域名:端口号/服务名')    
#获取游标
cursor=conn.cursor()      

#生成30分钟前的时间的字符串,注意前后再加上一个单引号'
str_time="'"+str(datetime.datetime.now()-datetime.timedelta(minutes=30))+"'"

#生成sql语句
sql="select cur from datasheet where occur_time>to_date(substr(%s,1,19),'yyyy-mm-dd hh24:mi:ss')"%(str_time)

#使用cursor进行查询操作
result=cursor.execute(sql)      

#获取所有数据(最近30分钟的)
data=result.fetchall()  

#关闭cursor        
cursor.close()                   
#关闭连接
conn.close()                     

特别提示:

由于str(datetime.datetime.now())生成的时间是这样的一个字符串:2019-04-16 17:02:57.033483,而我们数据库里的occur_time是这样的:2019-04-16 17:02:57由19个字符组成,所以需要使用substr(%s,1,19)截取正确的时间。

由于substr(%s,1,19)处理的是字符串,用变量str_time替换后应该是这样:substr('2019-04-16 17:02:57',1,19),这也就是为什么必须在前后加上单引号的原因了:str_time="'"+str(datetime.datetime.now()-datetime.timedelta(minutes=30))+"'",否则将会是这样的:substr(2019-04-16 17:02:57,1,19),这就明显不对了有没有。

你可能感兴趣的:(2019-04-16【Python笔记】查询Oracle数据 条件包含时间时的处理)