Ora 01843 not a valid month как исправить
Перейти к содержимому

Ora 01843 not a valid month как исправить

Как мне исправить ORA-01843: недействительный месяц?

И я попытался просмотреть несколько статей с одной наиболее заметной:

Как изменить формат даты в Oracle BI Publisher?

Я также пытался использовать:

Проходя через структуру и XML, я заметил, что моя дата в строковом формате:

имя элемента = «DATETIME» value = «DATETIME» label = «DATETIME» dataType = «xsd: string» breakOrder = «ascending» fieldOrder = «3»

Поэтому я удалил to_char, чтобы получить формат даты

Я получаю ошибку:

java.sql.SQLDataException: ORA-01843: недопустимый месяц

Как я могу исправить эту проблему?

РЕДАКТИРОВАТЬ: Формат для столбца, TIMESTAMP, формат CHAR (14) Пример значений, как 20200701103038 Он отлично работает в SQL Developer

2 ответа

Что ж, это довольно плохая и расширенная практика — хранить DATES в виде строк, используя varchar2 или char. В любом случае, сказав это, я думаю, что у вас проблемы с настройками или с тем, как вы строите свой запрос:

Кроме того, как вы сказали, если ваши данные хранятся как YYYYMMDDHHMISS, вы применяете неправильную маску даты YYYY-MM-DD HH24: MI: SS к этому символу. Я бы использовал CAST, чтобы определить поле как DATE.

Если вы не можете изменить настройки сеанса NLS, вы должны применить TO_CHAR к полученному результату. Но в вашем случае вы хотите оперировать датами, поэтому, если это значение даты, с которым вы хотите оперировать, вы можете забыть о маске.

Поэтому, если вы хотите сравнить дату с другой датой, не используйте to_char . Если вы хотите показать значение в определенном формате, когда у вас нет возможности изменить настройки, используйте to_char .

Просто чтобы убедиться, что SYSDATE (я собираюсь выбрать) представляет:

Это способ получить полученную ошибку: применить маску неправильного формата к строке, которая представляет значение DATE:

Как это исправить? Обычно это трудно исправить, если даты представлены в виде строк. Они (строки, представляющие даты) похожи на коробку конфет, вы никогда не знаете, что получите. Если есть хотя бы одно неправильное значение, запрос завершится неудачно.

Как найти неправильные значения? Вы можете создать функцию, которая возвращает TRUE (или 1, или что вы хотите), если строка, которую вы передаете ей, представляет допустимый формат даты. Но если вы передадите 01/02/03 , что это? Соответствуют различные форматы (например, dd/mm/yy , yy/mm/dd , mm/yy/dd . ). В худшем случае это 84/25/32 или AB/23/2f . Все они являются строками, они «соответствуют» двум символам, разделенным косой чертой , но, безусловно, не являются действительными датами, поэтому нельзя полагаться на простое регулярное выражение.

Oracle 10g, ora-01843, как настроить дату?

Сразу хочу сказать, в оракле я не профессионал, но чтение мануалов и поиск в гугле не помогли.
Проблема — поднял новый сервер oracle 10g, залил данные.
При попытке взаимодействия с данными получаю ошибку — ora-01843 (не валидный месяц).

У данных дата выглядит вот так: 19-DEC-07.
Делаю команду:
ALTER SESSION SET NLS_DATE_FORMAT = ‘DD-MON-YY’;

Потом:
SELECT TO_DATE(’20-DEC-07′) FROM TABLE;
Получаю результат
ORA-01843: месяц не верен.

В итоге два вопроса:
1) Какой формат данных должен быть для данной как пример даты?
2) Каким образом записать информацию о формате даты в базу, чтобы после перезагрузки сервера настройка не слетала?

ORA-01843 not a valid month- Comparing Dates

I have a problem when try to select data from a table filtering by date.

The Oracle Error is:

Probably the source data of table is corrupted, in this case:

  • How can i solve this problem?
  • Can I change this dates for null?

The results of this select, select * from nls_session_parameters; , is:

user avatar

12 Answers 12

You should use the to_date function (oracle/functions/to_date.php )

user avatar

You are comparing a date column to a string literal. In such a case, Oracle attempts to convert your literal to a date, using the default date format. It’s a bad practice to rely on such a behavior, as this default may change if the DBA changes some configuration, Oracle breaks something in a future revision, etc.

Instead, you should always explicitly convert your literal to a date and state the format you’re using:

If you don’t need to check exact timestamp, use

otherwise, you can use

Here, you use hard code date,if you directly compare then you must use DD-MM-YY HH24:MI:SS else you might get ORA-01849: hour must be between 1 and 12.

I know this is a bit late, but I’m having a similar issue. SQL*Plus executes the query successfully, but Oracle SQL Developer shows the ORA-01843: not a valid month error.

SQL*Plus seems to know that the date I’m using is in the valid format, whereas Oracle SQL Developer needs to be told explicitly what format my date is in.

SQL*Plus statement :

Oracle SQL Developer statement :

user avatar

user avatar

Just in case this helps, I solved this by checking the server date format:

then by using the following comparison (the left field is a date+time):

I was trying this with TO_DATE but kept getting an error. But when I matched my string with the NLS_DATE_FORMAT and removed TO_DATE , it worked.

user avatar

In a comment to one of the answers you mention that to_date with a format doesn’t help. In another comment you explain that the table is accessed via DBLINK.

So obviously the other system contains an invalid date that Oracle cannot accept. Fix this in the other dbms (or whatever you dblink to) and your query will work.

Having said this, I agree with the others: always use to_date with a format to convert a string literal to a date. Also never use only two digits for a year. For example ’23/04/49′ means 2049 in your system (format RR), but it confuses the reader (as you see from the answers suggesting a format with YY).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *