Как задать в запросе с where условие по дате?

Я пишу запросы к БД SQL Server через pyodbc.

Если написать запрос таким образом, то столбец показывается:

conn = pyodbc.connect('Driver={SQL Driver};'
                      'Server=сервер;'
                      'Database=БД;'
                      'username=логин;'
                      'password=пароль;')

cursor = conn.cursor()

sql_query = pd.read_sql_query('SELECT дата FROM таблица ',conn)
print(sql_query)
sql_query.info()

Результат: дата
0   YYYY-MM-DD
1   YYYY-MM-DD
2   YYYY-MM-DD
3   YYYY-MM-DD
4   YYYY-MM-DD
..         ...
230 YYYY-MM-DD
231 YYYY-MM-DD
232 YYYY-MM-DD
233 YYYY-MM-DD
234 2020-07-20

Хочется написать запрос, который показывает только записи за дату 2020-07-20

Если написать так:

sql_query = pd.read_sql_query('SELECT дата FROM таблица where дата = 2020-07-20 ',conn)

То выходит ответ: Empty DataFrame

Columns: дата
Index: []
<class 'pandas.core.frame.DataFrame'>
Index: 0 entries
Data columns (total 1 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   дата   0 non-null      object
dtypes: object(1)
memory usage: 0.0+ bytes

И пишет, что тип данных object.

Если написать так:

sql_query = pd.read_sql_query('SELECT дата FROM таблица where дата = '2020-07-20' ',conn)

То выходит ошибка: SyntaxError: invalid syntax

Пробовала написать запрос в самой БД. Там без кавычек так же пусто, а с кавычками такая ошибка:

Преобразование типа данных varchar в тип данных datetime привело к выходу значения за пределы диапазона.


Ответы (1 шт):

Автор решения: MaxU

наиболее идиоматичный способ - использование параметризованного запроса вместе со связанными переменными:

qry = """SELECT * FROM таблица WHERE дата = ?"""
params = [pd.to_datetime("2020-07-20")]
df = pd.read_sql(qry, conn, params=params)

вместо жесткого прописывания значений в запросе - лучше использовать параметризованные запросы (вместо значений используйте знак вопроса) и подставлять значения при помощи параметра params. Это будет и эффективнее и безопаснее, т.к. сделает невозможным использование SQL Injections.

→ Ссылка