将日期传递给调用sql server的python中的函数

时间:2016-06-13 20:04:14

标签: python sql-server datetime pandas pyodbc

我正在尝试将date1和date 2传递给python中的一个函数,该函数从sql server创建一个数据框

  import datetime as dt
  import pandas as pd
  import pyodbc
  import sqlalchemy
  from pandas import Series,DataFrame
  cnx=sqlalchemy.create_engine("mssql+pyodbc://Omnius:MainBrain1@172.31.163.135:1433/Basis?driver=/opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1790.0")

def func1(date1,date2):
sqlquery = "select top 10000 * from Pretty_Txns where Pay_Date between '"+date1+"' and '"+date2+"'"
df=pd.read_sql(sqlquery,cnx)

当我尝试从ipython

调用此函数时
  func1(dt.date(2015,05,01),dt.date(2015,05,02))

  ----> 8     sqlquery = "select top 10000 * from Pretty_Txns where Pay_Date between  '"+date1+"' and '"+date2+"'"

 TypeError: cannot concatenate 'str' and 'datetime.date' objects

如何调用该函数以便我不会出现类型错误。

2 个答案:

答案 0 :(得分:0)

sqlquery = "select top 10000 * from Pretty_Txns where Pay_Date between :date1 and :date2"

df=pd.read_sql(sqlquery,cnx, params=dict(date1=date1, date2=date2))

如果您的驱动程序不支持命名占位符,则像以前一样使用问号,并将[date1,date2]列表作为值传递给params。

答案 1 :(得分:0)

这应该让你开始。除非日期格式匹配,否则您的SQL可能无法运行。打印出sqlquery并在CLI中进行测试。

转换示例:

t = datetime.datetime(2012, 2, 23, 0, 0)
t.strftime('%m/%d/%Y')


def func1(date1,date2):
      strDate1 =  date1.strftime('%m/%d/%Y')
      strDate2 =  date2.strftime('%m/%d/%Y')

      sql = "select top 10000 * from Pretty_Txns where Pay_Date > '%s' and Pay_Date < '%s'  " %    (strDate1, strDate2)
      return sql

sqlquery = func1( DateOne,DateTwo )
#print sqlquery. 

df=pd.read_sql(sqlquery,cnx)