在 Python 中将日期变量设置为 SQL 查询

Set a date variable to SQL query in Python

我想在 python 中进行 sql 查询。我可以使用 cx_oracle 连接数据库 python:

# Build connection
conn_str = u'username/password@host:1521/sid'
conn = cx_Oracle.connect(conn_str)

现在我正在尝试使用 Python 中的 SQL 查询从数据库中检索数据:

sql_select_statement = """SELECT * FROM TABLE 
WHERE DATE BETWEEN '20-oct-2017' AND '30-oct-2017'"""

假设我们不知道开始日期,我们只有一个名为 starting_time 的日期变量,它的值是日期时间 %m/%d/%Y。另外,ending_time 是昨天,我想将我的 SQL 查询修改为:

sql_select_statement = """SELECT * FROM TABLE 
WHERE DATE BETWEEN '20-oct-2017' AND sysdate-1"""

df = pd.read_sql(sql_select_statement, conn)

它可以工作并生成一个新的 df,但是如何用变量 starting_time 替换“20-oct-2017”?它在 sql 查询中,并且是日期时间格式,因此像 'd%' % 变量这样的一般 python 方法不起作用。如何解决这个问题呢?谢谢!

考虑 SQLAlchemy to connect pandas and use the params argument of pandas.read_sql 将变量绑定到 SQL 语句:

from sqlalchemy import create_engine

engine = create_engine("username/password@host:1521/sid")

sql_select_statement = "SELECT * FROM TABLE WHERE DATE BETWEEN :my_date AND sysdate-1"

my_var = '20-oct-2017'
df = pd.read_sql(sql_select_statement, engine, params={'my_date':my_var})

或者,继续使用带有参数化的原始连接:

sql_select_statement = "SELECT * FROM TABLE WHERE DATE BETWEEN :my_date AND sysdate-1"

my_var = '20-oct-2017'
df = pd.read_sql(sql_select_statement, conn, params={'my_date':my_var})