Как задать в запросе с 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 шт):
наиболее идиоматичный способ - использование параметризованного запроса вместе со связанными переменными:
qry = """SELECT * FROM таблица WHERE дата = ?"""
params = [pd.to_datetime("2020-07-20")]
df = pd.read_sql(qry, conn, params=params)
вместо жесткого прописывания значений в запросе - лучше использовать параметризованные запросы (вместо значений используйте знак вопроса) и подставлять значения при помощи параметра params. Это будет и эффективнее и безопаснее, т.к. сделает невозможным использование SQL Injections.