2016-09-12 45 views
1

特定の日付範囲のSQLServerデータベースを照会しようとしました。どういうわけか私はそれを自分で理解できません。ここに私がやったことです:PythonのSQLクエリの日付範囲

import pyodbc 
    import pandas as pd 
    con = pyodbc.connect("Driver={SQL Server}; Server=link") 
    tab = pd.read_sql_query("SELECT * FROM OPENQUERY(aaa, 'SELECT * FROM bbb.ccc WHERE number like (''K12345%'')')",con) 

    tab['DT'] 
    0 2015-09-17 08:51:41 
    1 2015-09-17 09:14:09 
    2 2015-09-17 09:15:03 
    3 2015-09-24 15:20:55 
    4 2015-09-24 15:23:47 
    5 2015-10-02 08:49:59 
    6 2015-10-30 14:08:40 
    7 2015-10-30 14:13:38 
    8 2015-11-03 14:30:06 
    9 2015-11-03 14:30:22 
    10 2015-11-04 07:14:40 
    11 2015-11-04 10:43:51 
    Name: DT, dtype: datetime64[ns] 

今、私は次のクエリを使用して2015-09-182015-10-02の間の日付のレコードを選択することができるはずと思いました。どういうわけかエラーで失敗しました

DatabaseError: Execution failed on sql: SELECT * FROM OPENQUERY(aaa, 'SELECT * FROM bbb.ccc WHERE DT between ''2015-09-18'' and ''2015-10-02''')".

私が間違ったことを説明できる人がいますか?

tab2 = pd.read_sql_query("SELECT * FROM OPENQUERY(aaa, 'SELECT * FROM bbb.ccc `WHERE DT between ''2015-09-18'' and ''2015-10-02''')",con)` 
+1

もう少し調査したところ、同様の質問がありました。[link](http://stackoverflow.com/questions/32699299/using-openquery-with-an-oracle-database-to-query-a-date-range) 。 単純に日付形式の変換が必要です。次のコードは私のために動作します: tab2 = pd.read_sql_query( "to * '02 -Oct-2015 '') ') "、con)' – lignin

答えて

0

あなたはparameter bindingを使用する必要があります。

tab2 = pd.read_sql_query("SELECT * FROM bbb.ccc WHERE DT between ? and ?", con, params=['2015-09-18', '2015-10-02']) 

?は、リストから渡される値のプレースホルダです。 ?の数は、あなたのリストからの項目の数と一致しなければなりません。

なぜSELECT *が別のSELECT *にラップされているのかわからないので、最も内側のセレクトだけで簡略化しました。

+0

あなたはそれについて少し考えてみると、それはまったく理にかなっています。良い探偵仕事。 –