При импорте данных в среду Python из базы данных Oracle - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь импортировать одну из таблиц представления o Python, выполнив следующий код.Но проблема в том, что, запустив тот же код на Oracle SQl Developer, я получаю данные, но, выполняя ту же строку кода, я получаю ноль строк данных (нет данных).Код успешно выполняется, и связь с БД Oracle также хорошо установлена.Пожалуйста, помогите мне, как получить данные, загруженные на python

Я пытался использовать функцию To_Date для получения результатов

import cx_Oracle

cx_Oracle.clientversion()

conn = cx_Oracle.connect('##########')

c = conn.cursor()

querystring1 = "(select * from CP_FALLOUT_VIEW where SCOPE_DT = TO_DATE(sysdate-90))"

df1 = pd.read_sql_query(querystring1, con=conn)

Ожидаемый: Dataframe со всеми строками данных

Actual: Dataframe со всеми заголовками, но без строк данных

1 Ответ

1 голос
/ 03 мая 2019

Функция SYSDATE уже возвращает значение DATE, поэтому ...TO_DATE(sysdate-90) не требуется.Также я не вижу причин заключать весь запрос в скобки.Однако имейте в виду, что в Oracle DATE - это метка времени, содержащая поля для года, месяца, дня, часов, минут и секунд.Когда выполняется сравнение, такое как SCOPE_DT = SYSDATE - 90, значение SCOPE_DT должно соответствовать не только году / месяцу / дню из SYSDATE, но также часам: минутам: секундам.Я подозреваю, что вы действительно хотите что-то вроде

select *
  from CP_FALLOUT_VIEW
  where TRUNC(SCOPE_DT) = TRUNC(sysdate) - 90

Здесь функция TRUNC используется для обрезания дат, то есть для установки часов: минут: секунд до 00:00:00, чтобы мы могли эффективносравнивайте только часть дня / месяца / года значений DATE.

Но это будет медленно, потому что мы применяем функцию TRUNC к каждой строке в представлении.Лучшим вариантом будет

SELECT *
  FROM CP_FALLOUT_VIEW
  WHERE SCOPE_DT BETWEEN TRUNC(SYSDATE) - 90
                     AND TRUNC(SYSDATE) - 89

Здесь вы определяете, находится ли SCOPE_DT между началом SYSDATE-90 и днем, следующим за ним, то есть SYSDATE-89.Однако даже у этого есть одна небольшая проблема - он выберет SCOPE_DT, который точно соответствует TRUNC (SYSDATE) -89, потому что сравнение BETWEEN включает его конечные точки.Таким образом, чтобы включить только даты, приходящиеся на день, который в прошлом точно равен 90 дням, и работают достаточно разумно, вы бы хотели использовать

SELECT *
  FROM CP_FALLOUT_VIEW
  WHERE SCOPE_DT BETWEEN TRUNC(SYSDATE) - INTERVAL '90' DAY
                     AND TRUNC(SYSDATE) - INTERVAL '89' DAY - INTERVAL '1' SECOND

Best of luck.

...