2016-09-12 6 views
1

Ich habe einfach versucht, eine SQLServer Datenbank in einem bestimmten Datumsbereich abzufragen. Irgendwie kann ich es mir selbst nicht erklären. Hier ist, was ich getan habe:SQL-Abfrage-Datumsbereich in Python

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] 

Jetzt dachte ich, ich sollte in der Lage sein, die Aufzeichnungen über die Tage zwischen 2015-09-18 und 2015-10-02 mithilfe der folgenden Abfrage auszuwählen. Irgendwie ist es mit Fehler

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

Kann jemand erklären helfen, was ich falsch tat?

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

Ein wenig mehr Forschung fand ähnliche Frage hier: [link] (http://StackOverflow.com/Questions/32699299/using-OpenQuery-with-an-oracle-Database-Toquery-a-Date-range) . Es muss lediglich das Datumsformat konvertiert werden. Der folgende Code funktioniert jetzt für mich: tab2 = pd.read_sql_query ("SELECT * FROM OPENQUERY (aaa, 'SELECT * VON bbb.ccc' WHERE DT zwischen to_date (' '18-Sep-2015' ') und to_date (' '02 -Oct-2015 ')') ", con)' – lignin

Antwort

0

sollten Sie parameter binding verwenden:

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

Die ? sind Platzhalter für die Werte, die Sie aus der Liste vorbei sind. Die Nummer von ? muss mit der Anzahl der Elemente aus Ihrer Liste übereinstimmen.

Und ich bin mir nicht sicher, warum Sie eine SELECT * in einem anderen SELECT * gewickelt haben, so dass ich mit nur der innersten Auswahl vereinfacht.

+0

Wenn du ein bisschen darüber nachdenkst, macht es total Sinn, richtig. Gute Detektivarbeit. –