Oracle - неверное значение даты в столбце DATE - PullRequest
0 голосов
/ 14 июля 2020

Я столкнулся со странной ситуацией, когда Oracle не позволяет мне выбирать строки по значению DATE, которое есть в БД.

Есть какая-то таблица со столбцом TRANS_DATE (тип данных DATE) .

Я пытаюсь импортировать данные с этого Oracle на сервер MS Sql, и импорт завершается с ошибкой "неправильное значение для столбца DATE".

После некоторого расследования я обнаружил, что там странное значение '0002-11-30' в исходной таблице.

SELECT a
FROM (
SELECT DISTINCT  trunc(TRANS_DATE) a
FROM OWS.DOC
)
ORDER BY a asc

Хорошо, я попытался выбрать строки из Oracle по этому значению, но получаю сообщение об ошибке:

SELECT *
FROM OWS.DOC
WHERE TRANS_DATE='0002-11-30 00:00:00'

Ошибка:

SQL Error [1847] [22008]: ORA-01847: day of month must be between 1 and  last day of month

Я тоже пробовал этот выбор:

SELECT *
FROM OWS.DOC
WHERE TRANS_DATE=to_date('0002-11-30', 'yyyy-mon-dd')

Он возвращает мне ошибку

SQL Error [1843] [22008]: ORA-01843: not a valid month

Как мне построить PL- SQL запрос выбрать для таких данных?

Ответы [ 4 ]

0 голосов
/ 14 июля 2020

На основании ваших запросов я предполагаю, что столбец TRANS_DATE имеет тип данных DATE. Поэтому ваши запросы неверны.

SELECT * FROM OWS.DOC WHERE TRANS_DATE='0002-11-30 00:00:00';

В этом выборе вы сравниваете строковый тип данных с типом данных даты.

SELECT * FROM OWS.DOC WHERE TRANS_DATE=to_date('0002-11-30', 'yyyy-mon-dd');

В этом случае вы используете «mon» вместо «mm», где «mon» - это текстовое трехбуквенное представление месяца с добавлением чисел c, как указано вами. Но исправление этого, скорее всего, приведет к тому, что данные не будут найдены, поскольку в первом запросе вы обрезаете даты, поэтому вы должны сделать то же самое.

Это должно сделать это:

SELECT * FROM OWS.DOC WHERE trunc(TRANS_DATE) = to_date('0002-11-30', 'yyyy-mm-dd');

SQL Fiddle например: http://sqlfiddle.com/#! 4 / 00272/1

0 голосов
/ 14 июля 2020

«пн» в «гггг-пн-дд» означает сокращение месяца, попробуйте что-то вроде этого

select to_date('0002-Nov-30', 'yyyy-mon-dd') from dual

0 голосов
/ 14 июля 2020

Вы сказали:

WHERE TRANS_DATE=to_date('0002-11-30', 'yyyy-mon-dd')

Он возвращает мне ошибку

SQL Error [1843] [22008]: ORA-01843: not a valid month

Посмотрите, что вы сделали:

to_date('0002-11-30' , 'yyyy-mon-dd')

Действительно ли 0002-11-30 кажется вам YYYY-MON-DD? Не ко мне, да и, видимо, к Oracle тоже. MON означает (на английском sh) JAN, FEB, MAR, ... DEC. Следовательно, сопоставьте маску формата со значением:

to_date('0002-11-30', 'yyyy-mm-dd')
0 голосов
/ 14 июля 2020
SELECT *
FROM OWS.DOC
WHERE TRANS_DATE=to_date('0002-11-30', 'yyyy-mm-dd')

или

SELECT *
FROM OWS.DOC
WHERE TRANS_DATE=date'0002-11-30'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...