Not a valid month oracle ошибка
И я попытался просмотреть несколько статей, одна из которых наиболее примечательна:
Как изменить формат даты в 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 ответа
Что ж, это довольно плохая и распространенная практика - хранить ДАТЫ в виде строк, используя varchar2 или char. В любом случае, сказав это, я думаю, у вас есть проблема с вашими настройками или тем, как вы строите свой запрос:
Кроме того, как вы сказали, если ваши данные хранятся как YYYYMMDDHHMISS, вы применяете неправильную маску даты YYYY-MM-DD HH24:MI:SS к этому char. Я бы использовал 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 . Все они являются строками, они "соответствуют" двум символам, разделенным косой чертой, но определенно не являются допустимыми датами, поэтому вы не можете полагаться на простое регулярное выражение.
У меня проблема при попытке выбрать данные из таблицы с фильтрацией по дате.
Возможно, исходные данные таблицы повреждены, в этом случае:
- Как я могу решить эту проблему?
- Могу ли я изменить эти даты на ноль?
Результаты этого выбора select * from nls_session_parameters; :
Вы должны использовать функцию to_date (oracle/functions/to_date.php )
Сравнение столбца даты с строковым литералом. В таком случае Oracle пытается преобразовать ваш литерал в дату, используя формат даты по умолчанию. Плохая практика заключается в том, чтобы полагаться на такое поведение, поскольку это значение по умолчанию может измениться, если администратор баз данных изменит какую-либо конфигурацию, Oracle нарушит что-то в будущей редакции и т.д.
Вместо этого вы всегда должны явно преобразовывать свой литерал в дату и указывать формат, который вы используете:
Если вам не нужно проверять точную метку времени, используйте
в противном случае вы можете использовать
Здесь вы используете дату жесткого кода, если вы прямо сравниваете, то вы должны использовать DD-MM-YY HH24: MI: SS еще вы можете получить ORA-01849: час должен быть между 1 и 12.
Я знаю, что уже немного поздно, но у меня похожая проблема. SQL*Plus успешно выполняет запрос, но Oracle SQL Developer показывает ORA-01843: not a valid month error.
SQL*Plus , кажется, знает, что дата, которую я использую, имеет допустимый формат, в то время как Oracle SQL Developer необходимо четко указать, в каком формате находится моя дата.
SQL*Plus statement :
Oracle SQL Developer statement :
На всякий случай это помогает, я решил это, проверив формат даты сервера:
затем используя следующее сравнение (левое поле - дата + время):
Я пытался с помощью TO_DATE , но продолжал получать ошибку. Но когда я сопоставил свою строку с NLS_DATE_FORMAT и удалил TO_DATE , она сработала.
Таким образом, очевидно, что другая система содержит недопустимую дату, которую Oracle не может принять. Исправьте это в других dbms (или что бы вы ни отметили), и ваш запрос будет работать.
Если исходная дата содержит минуты и секунды, ваше сравнение дат не будет выполнено. вам необходимо преобразовать исходную дату в требуемый формат, используя to_char и целевую дату.
Посмотрите другие вопросы по меткам date sql oracle select или Задайте вопрос
ошибка в дате
Добрый день! Есть такой запрос: SELECT RECORD.R_DT, FROM "RECORD" WHERE "R_DT">'2011-10-10.
Ошибка в записи фильтра по дате
Ошибка в строке: Table1.Filter:=((TDateField)>=(date1)) AND ((TDateField)<=(date2));Пишет ошибки.
Выборка записей по дате, синтаксическая ошибка
Здравствуйте! Подскажите пожалуйста решение. Необходимо сделать выборку записей из бд access по.
Синтаксическая ошибка в запросе выборки данных по дате
Подскажите как правильно написать запрос Так работает: SqlCom = New OleDb.OleDbCommand("SELECT.
Как правило подобная ошибка возникает тогда, когда строка преобразуется в дату и NLS-настройки сессии не соответствуют заданной строке Т.е. в таблице поле типа date, это поле без всякого преобразования вызывается в SELECT, причем SELECT именно из таблицы, а не их View? И ты еще не успел сделать ни одного fetch из курсора? Я попробовал создать таблицу на её основе, то работает. А когда функцию вызываю, то нет почему у тебя везде используется to_date, а здесь нет?
Формат даты - NLS-зависимая величина, поэтому подобная штука в одной сессии может пройти, а в другой нет (в зависимости от тек. установок сессии). Правильнее везде использовать to_date с форматом для однозначности.
Посмотри еще раз все - может я еще где-то что-то пропустил
По дате рождения и сегодняшней дате посчитать количество прожитых часов (используя классы)
С помощью классов,создать программу, которая считает сколько часов вы прожили. Вводим дату рождения.
По дате 23.04.2039 или другой дате XXI века определить день недели
"Вечный календарь". По дате 23.04.2039 или другой дате XXI века оп-ределить день недели. Напечатать.
Отфильтровать из всех новостей 3 ближайших по дате к заданной дате
Не могу дотумкать, как отфильтровать из всех новостей 3 ближайших по дате к заданной дате. То.
Определить возраст пользователя по дате рождения и текущей дате
Составить программу, которая запрашивает у пользователя год его рождения и текущий год и выводит.
У меня проблема при попытке выбрать данные из таблицы с фильтрацией по дате.
Вероятно, исходные данные таблицы повреждены, в этом случае:
- Как я могу решить эту проблему?
- Могу ли я изменить эти даты на null?
Результаты этого выбора, select * from nls_session_parameters; , является:
Вы должны использовать to_date функция (oracle / functions / to_date.php)
Вы сравниваете столбец даты со строковым литералом. В таком случае Oracle пытается преобразовать ваш литерал в дату, используя формат даты по умолчанию. Полагаться на такое поведение - плохая практика, поскольку это значение по умолчанию может измениться, если администратор баз данных изменит некоторую конфигурацию, Oracle что-то сломает в будущей версии и т. Д.
Вместо этого вы всегда должны явно преобразовывать свой литерал в дату и указывать используемый формат:
- Конечно, Мурейник, но если у вас есть таблица с этой датой: 23.04.49 и вы попытаетесь выполнить поиск с предыдущим выбором, вы получите ту же ошибку?
Если вам не нужно проверять точную метку времени, используйте
в противном случае вы можете использовать
Здесь вы используете дату с жестким кодом, если вы напрямую сравниваете, вы должны использовать DD-MM-YY HH24: MI: SS, иначе вы можете получить ORA-01849: час должен быть между 1 и 12.
Я знаю, что это немного поздно, но у меня похожая проблема. SQL*Plus выполняет запрос успешно, но Oracle SQL Developer показывает ORA-01843: not a valid month error.
SQL*Plus похоже, знает, что дата, которую я использую, находится в допустимом формате, тогда как Oracle SQL Developer необходимо явно указать, в каком формате моя дата.
SQL*Plus statement :
Oracle SQL Developer statement :
На всякий случай я решил это, проверив формат даты сервера:
затем, используя следующее сравнение (левое поле - дата + время):
Я пробовал это с TO_DATE но продолжал получать ошибку. Но когда я сопоставил свою строку с NLS_DATE_FORMAT и удалено TO_DATE , это сработало.
ALTER набор сеансов NLS_LANGUAGE = ’AMERICAN’;
Очевидно, что другая система содержит недопустимую дату, которую Oracle не может принять. Исправьте это в других dbms (или в другом месте, на которое вы ссылаетесь), и ваш запрос будет работать.
Если исходная дата содержит часть минут и секунд, сравнение дат завершится ошибкой. вам необходимо преобразовать исходную дату в требуемый формат, используя to_char, а также целевую дату.
Если вы используете инструменты командной строки, вы также можете установить его в оболочке.
В linux с оболочкой типа sh вы можете, например, сделать:
Затем вы можете использовать инструменты командной строки, и он будет использовать указанный формат:
Читайте также: