2016-09-12 5 views
1

Я просто пытался запросить базу данных SQLServer в определенном диапазоне дат. Почему-то я просто не могу понять это сам. Вот что я сделал:Диапазон дат запроса SQL в 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] 

Теперь я думал, что я должен быть в состоянии выбрать записи о датах между 2015-09-18 и 2015-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 ("SELECT * FROM OPENQUERY (aaa, 'SELECT * FROM bbb.ccc" WHERE DT между to_date (' '18-Sep-2015' ') и to_date (' '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

Если вы думаете об этом немного, это совершенно разумно, правильно. Хорошая детективная работа. –

Смежные вопросы