Функция Oracle SQL to_date не работает с объединенными строками - PullRequest
0 голосов
/ 20 января 2011

Я искал причину, по которой это не работает в течение достаточно долгого времени. Я объединяю два поля и пытаюсь выполнить некоторые сравнения дат, но выдает ошибку ORA-01843: недопустимый месяц. Я не уверен, что я делаю здесь не так.

Вот мой код:

SELECT
   sm.semester_date || cp.start_year AS effective
FROM
   database.table cp,
   database.table2 sm
WHERE   cp.semesters_id = sm.semesters_id 
AND  to_date(sm.semester_date || cp.start_year, 'MM/DD/YYYY') >= to_date('06/01/2011', 'MM/DD/YYYY')

Он работает нормально, пока я не добавлю это оператор AND в конце. Но мне нужно отфильтровать набор данных.

При запуске без фильтра возвращается 15.08.2010 и т. Д.

Я забыл добавить маску изначально, когда я опубликовал это, я исправил это. Тем не менее, он по-прежнему возвращает эту ошибку ORA-01840: входное значение недостаточно длинное для формата даты.

РЕДАКТИРОВАТЬ РЕШЕНИЕ НАЙДЕНО: Во-первых, спасибо всем за помощь в этом, ребята, вы молодцы. Во-вторых, моя ошибка была вызвана курсом без начального года. Очень расстраивает, так как этого не должно быть. Поскольку у связанного элемента не было года, он выдавал ошибку. Я нашел это только потому, что вы, ребята, помогли мне исправить мой код. Спасибо.

Ответы [ 4 ]

3 голосов
/ 20 января 2011

Попробуйте добавить разделитель между датой и годом:

SELECT
   sm.semester_date || '/' || cp.start_year AS effective
FROM
   database.table cp,
   database.table2 sm
WHERE   cp.semesters_id = sm.semesters_id 
AND  to_date(sm.semester_date || '/' || cp.start_year) >= to_date('06/01/2011', 'MM/DD/YYYY')

Если вы запустите запрос без фильтра, что он вернет?

1 голос
/ 20 января 2011

Является ли столбец SEMESTER_DATE VARCHAR2?И если так, это строка в формате «ММ / ДД /»?Или просто «MM / DD»?

Как указывает lweller, в первом TO_DATE также отсутствует маска формата, что может быть проблемой, если NLS_DATE_FORMAT вашего сеанса отличается от «MM / DD / YYYY»..

Предполагая, что SEMESTER_DATE является VARCHAR2 в формате 'MM / DD', я подозреваю, что вы хотите

AND to_date( sm.semester_date || '/' || cp.start_year, 'MM/DD/YYYY' ) >= 
      to_date( '06/01/2011', 'MM/DD/YYYY' )
1 голос
/ 20 января 2011

Я предполагаю, что ваш формат даты по умолчанию не соответствует формату строки, которую вы передаете TO_DATE.Добавьте строку формата в качестве второго параметра к вызову (как вы сделали для второго вызова), чтобы указать, каков формат объединенной строки.

0 голосов
/ 20 января 2011

Ваш первый TO_DATE () использует системный формат по умолчанию.Укажите второй аргумент с правильной строкой формата, такой как 'MM/DD/YYYY'.Пожалуйста, сравните:

SELECT SEMESTER_DATE || START_YEAR AS BARE_STRING, TO_DATE(SEMESTER_DATE || START_YEAR) AS CASTED_TO_DATE
FROM (
    SELECT '12/31' AS SEMESTER_DATE, 2010 AS START_YEAR
    FROM DUAL
);

SELECT SEMESTER_DATE || START_YEAR AS BARE_STRING, TO_DATE(SEMESTER_DATE || START_YEAR, 'MM/DD/YYYY') AS CASTED_TO_DATE
FROM (
    SELECT '12/31' AS SEMESTER_DATE, 2010 AS START_YEAR
    FROM DUAL
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...