java. sql .SQLDataException: ORA-01830: изображение в формате даты заканчивается перед преобразованием всей входной строки (Oracle) - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь запустить скрипт через Java код

query.append("SELECT CNAME,CREATEDATE  FROM MERGE_DATA_VW \r\n" + 
       "WHERE TO_DATE(CREATEDATE, 'DD-MM-RR') = TO_DATE('26-NOV-19', 'DD-MM-RR')\";");
stmt = con.prepareStatement(query.toString());
rs = stmt.executeQuery();

При попытке запустить скрипт в Oracle SQL Разработчик работает нормально, но при запуске моего java код, который дает исключение SQLDataException:

java.sql.SQLDataException: ORA-01830: date format picture ends before converting entire input   string

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:440)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:837)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:445)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:191)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:523)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:863)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1153)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1275)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3576)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3620)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1491)

Я не могу найти причину ошибки, пожалуйста, кто-нибудь? Спасибо

Ответы [ 4 ]

1 голос
/ 12 марта 2020

Предполагая, что CREATEDATE является столбцом типа данных DATE, вам не нужно использовать TO_DATE для него (так как это уже DATE), вам также не нужен трейлинг \";.

Вы также можете использовать литерал даты.

При условии, что CREATEDATE всегда имеет компонент времени mignight:

query.append("SELECT CNAME,CREATEDATE  FROM MERGE_DATA_VW \r\n" + 
       "WHERE CREATEDATE = DATE '2019-11-26'");

Если ваш столбец CREATEDATE имеет компонент, не относящийся к полуночи, тогда вам нужно сравнить диапазон (или использовать TRUNC, но это не позволит вам использовать индекс для столбца и потребует отдельного индекса на основе функций):

query.append("SELECT CNAME,CREATEDATE  FROM MERGE_DATA_VW \r\n" + 
       "WHERE CREATEDATE >= DATE '2019-11-26' AND CREATEDATE < DATE '2019-11-27'");

0 голосов
/ 12 марта 2020

НЕПРАВИЛЬНЫЙ ФОРМАТ ДАТЫ В TO_DATE ('26 -NOV-19 ',' DD-MM-RR ')
Пожалуйста, укажите правильный формат даты =>' DD-MON-RR 'ДЛЯ '26 -NOV-19'

0 голосов
/ 12 марта 2020

Не думаю, что вам нужно TO_DATE для CREATEDATE, поскольку это уже дата.

Кроме того, ваш TO_DATE('26-NOV-19', 'DD-MM-RR') должен быть TO_DATE('26-NOV-19', 'DD-MON-RR')

Попробуйте:

SELECT
    CNAME,
    CREATEDATE
FROM
    MERGE_DATA_VW
WHERE
    TRUNC(CREATEDATE) = TO_DATE('26-NOV-19', 'DD-MON-RR');

Приветствия !!

0 голосов
/ 12 марта 2020

Вы, где caluse должен выглядеть -

WHERE TO_DATE(CREATEDATE, 'DD-MM-RR') = TO_DATE('26-11-19', 'DD-MM-RR')
...