Мне нужно извлечь данные из таблиц с миллионами строк и ограничить их данными только за последние два года. Я работаю над разработкой оператора SQL для входа в Power BI, чтобы ограничить возможности, которые он извлекает. Очевидно, я новичок, но не могу в этом разобраться, и все предложенные подходы мне не работают. Мне также непонятно, как конвертировать, ограничивать и извлекать все данные из этой таблицы.
Столбец LOADED_DATE имеет тип char(8), поэтому сначала я использовал TO_DATE для его преобразования, как вы можете видеть, но я не уверен, чего мне не хватает.
SELECT TO_DATE(LOADED_DATE, 'YYYYMMDD')
FROM ELLIPSE.MSF26A
WHERE LOADED_DATE >= ADD_MONTHS(SYSDATE,-24)
Ошибка SQL [1861] [22008]: ORA-01861: литерал не соответствует формату нить
🤔 А знаете ли вы, что...
SQL можно использовать для создания резервных копий и восстановления данных.
Вы пытаетесь сравнить строку с датой в предложении WHERE
. Попробуй это:
SELECT TO_DATE(LOADED_DATE, 'YYYYMMDD')
FROM ELLIPSE.MSF26A
WHERE TO_DATE(LOADED_DATE, 'YYYYMMDD') >= ADD_MONTHS(SYSDATE,-24)
Вероятно, вам также придется использовать преобразованную дату в предложении WHERE:
SELECT TO_DATE(LOADED_DATE, 'YYYYMMDD')
FROM ELLIPSE.MSF26A
WHERE TO_DATE(LOADED_DATE, 'YYYYMMDD') >= ADD_MONTHS(SYSDATE,-24)
Думаю, вам захочется ВЫБРАТЬ и другие поля из таблицы.
Если ваш строковый столбец loaded_date
проиндексирован, вы также можете преобразовать значение фильтра в строку:
SELECT TO_DATE(LOADED_DATE, 'YYYYMMDD')
FROM ELLIPSE.MSF26A
WHERE LOADED_DATE >= TO_CHAR(ADD_MONTHS(SYSDATE,-24), 'YYYYMMDD')
Это будет работать, потому что формат, в котором хранятся строки даты, будет сортироваться в алфавитном порядке.
В настоящий момент вы выполняете LOADED_DATE >= ADD_MONTHS(SYSDATE,-24)
, которое неявно преобразует LOADED_DATE
в тип даты с использованием настроек NLS вашего сеанса, которые не соответствуют вашему формату строкового значения - отсюда и ошибка - но это не очень хорошая идея, даже если они совпадают. для тебя; они могут быть не для кого-то другого, выполняющего запрос. Явное преобразование в дату с указанным форматом позволяет избежать этой проблемы, но не позволяет использовать простой индекс столбца, поскольку каждое значение в таблице необходимо преобразовать, прежде чем его можно будет сравнить. Даже если индекса нет, все равно придется выполнить множество ненужных преобразований.
Все равно было бы лучше хранить значения как даты и индексировать/сравнивать их как даты, но если вы застряли со строками, используйте наиболее эффективное сравнение, какое только можете.