Как сделать ссылку в запросе SQL на фреймы с датой?
Как правильно указать промежуток дат?
Пробую так:
pr = df456['Дата'].max().strftime('%Y-%m-%d')
tdate = datetime.datetime.today().strftime('%Y-%m-%d')
sql = f'''select so."Дата",
so."Вес",
so."№ дела"
from datamart.PIECE_PROD so
where so."Вес" = 'увеличился'
and so."№ дела" = 'доступно'
and so."Дата" between 'pr' AND 'tdate'
'''
osn_data = pd.DataFrame(mycur.execute(sql).fetchall(), columns=['Дата',
'Вес',
'№ дела'
])
osn_data
Но получаю ошибку:
DatabaseError: ORA-01858: a non-numeric character was found where a numeric was expected
Ответы (2 шт):
Автор решения: MaxU
→ Ссылка
Лучше воспользуйтесь методом pd.read_sql() и параметризированным запросом:
import pandas as pd
import cx_Oracle
from cx_Oracle import makedsn
from sqlalchemy import types, create_engine
usr = "test"
pwd = "my_oracle_password"
dsn = makedsn("ora_scan_or_hostname", 1521, service_name="my_service_name")
engine = create_engine(f'oracle+cx_oracle://{usr}:{pwd}@{dsn}')
qry = f'''select so."Дата",
so."Вес",
so."№ дела"
from datamart.PIECE_PROD so
where so."Вес" = 'увеличился'
and so."№ дела" = 'доступно'
and so."Дата" between :d1 AND :d2 '''
d1 = df456['Дата'].max()
d2 = pd.to_datetime("now")
params = (d1, d2)
df = pd.read_sql(qry, engine, params=params)
Автор решения: Денис
→ Ссылка
Благодарю всех за помощь, дело было в недостаче кавычек и функции TO_TIMESTAMP
sql = f'''select so."Дата",
so."Вес",
so."№ дела"
from datamart.PIECE_PROD so
where so."Вес" = 'увеличился'
and so."№ дела" = 'доступно'
and so."Дата" between TO_TIMESTAMP(''' +"'" +pr+ "','DD.MM.YYYY HH24:mi:ss')
and TO_TIMESTAMP('"+ tdate+"','DD.MM.YYYY HH24:mi:ss')"
osn_data = pd.DataFrame(mycur.execute(sql).fetchall(), columns=['Дата',
'Вес',
'№ дела'
])