Преобразование символов в дату и получение данных за последние два года

Мне нужно извлечь данные из таблиц с миллионами строк и ограничить их данными только за последние два года. Я работаю над разработкой оператора 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: литерал не соответствует формату нить

Хранение значений даты в виде строк часто заканчивается грандиозным провалом. Является ли каждое значение в LOADED_DATE 8-значным целым числом, которое преобразуется в дату в формате ГГГГММДД? То есть ничего похожего на «20230230» или «2 23 мая»?

dougp 25.07.2024 22:31

Все они имеют формат ГГГГММДД (8-значное целое число) или ноль.

wolfmansbrother505 25.07.2024 22:36

@ wolfmansbrother505 В этом случае ваша to_date может быть в порядке. Но WHERE LOADED_DATE >= ADD_MONTHS(SYSDATE,-24) по-прежнему сравнивается со строкой.

Error_2646 25.07.2024 22:39
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
3
57
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы пытаетесь сравнить строку с датой в предложении WHERE. Попробуй это:

SELECT TO_DATE(LOADED_DATE, 'YYYYMMDD')
FROM ELLIPSE.MSF26A
WHERE TO_DATE(LOADED_DATE, 'YYYYMMDD') >= ADD_MONTHS(SYSDATE,-24)

Спасибо! Вот и все, мне следовало об этом подумать.

wolfmansbrother505 25.07.2024 22:45

Вероятно, вам также придется использовать преобразованную дату в предложении WHERE:

SELECT TO_DATE(LOADED_DATE, 'YYYYMMDD')
FROM ELLIPSE.MSF26A
WHERE TO_DATE(LOADED_DATE, 'YYYYMMDD') >= ADD_MONTHS(SYSDATE,-24)

Думаю, вам захочется ВЫБРАТЬ и другие поля из таблицы.

Спасибо! Вот и все, мне следовало об этом подумать. Мне нужно, могу ли я легко все получить или мне придется перечислить их все?

wolfmansbrother505 25.07.2024 22:45
Ответ принят как подходящий

Если ваш строковый столбец 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 вашего сеанса, которые не соответствуют вашему формату строкового значения - отсюда и ошибка - но это не очень хорошая идея, даже если они совпадают. для тебя; они могут быть не для кого-то другого, выполняющего запрос. Явное преобразование в дату с указанным форматом позволяет избежать этой проблемы, но не позволяет использовать простой индекс столбца, поскольку каждое значение в таблице необходимо преобразовать, прежде чем его можно будет сравнить. Даже если индекса нет, все равно придется выполнить множество ненужных преобразований.

Все равно было бы лучше хранить значения как даты и индексировать/сравнивать их как даты, но если вы застряли со строками, используйте наиболее эффективное сравнение, какое только можете.

Отличный совет, большое спасибо!

wolfmansbrother505 25.07.2024 22:47

Другие вопросы по теме