Как я могу исправить эту ошибку «ORA-01843: недействительный месяц» - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь создать таблицу, используя следующий запрос:

create table customer1
(
custmer_id number, 
Customer_name varchar(20), 
Expiry_date  date default TO_DATE ('31-12-2009','dd-mon-RR')
)

В результате получается следующая ошибка:

Error report -
ORA-01843: not a valid month
01843. 00000 -  "not a valid month"
*Cause:    
*Action:

Любой, кто подскажет мне об этом.Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

[TL; DR] Используйте литерал даты:

CREATE TABLE customer1 (
  custmer_id    NUMBER, 
  Customer_name VARCHAR2(20), 
  Expiry_date   DATE        DEFAULT DATE '2009-12-31'
)

или модель формата MM:

CREATE TABLE customer1 (
  custmer_id    NUMBER, 
  Customer_name VARCHAR2(20), 
  Expiry_date   DATE        DEFAULT TO_DATE ('31-12-2009','DD-MM-RRRR')
)

Из Oracle Модели формата даты и времени :

  • MM: месяц (01-12; январь = 01).
  • MON: сокращенное название месяца.
  • MONTH: имя месяца, дополненное пробелами для отображения ширины самого широкого имени месяца на языке дат, используемом для этого элемента.

Oracle's String-to-Даты преобразования правил разрешают дополнительные правила форматирования (без применения других модификаторов).Итак:

  • MM также соответствует MON и MONTH;
  • MON соответствует MONTH (и наоборот);
  • RR совпадений RRRR
  • Пунктуация необязательна.

Используемая вами модель формата dd-mon-RR может соответствовать любому из (с дефисами или без них):

  • 31-dec-09
  • 31-december-09
  • 31-dec-2009
  • 31-december-2009

Но модель формата MON также несоответствует формату MM, поэтому не может соответствовать вашей строке.

Вместо этого следует использовать модель формата DD-MM-RR (или DD-MM-RRRR), которая может соответствовать (опять же, с дефисами или без них):

  • 31-12-09
  • 31-dec-09
  • 31-december-09
  • 31-12-2009
  • 31-dec-2009
  • 31-december-2009

Если вы хотите сопоставить только один формат даты, либо:

  • Используйте литерал даты DATE '2009-12-31' (который использует только ISO-8601формат даты, поэтому пропускает вопрос ввода, не соответствующий модели формата);или
  • Используйте модификатор модели формата FX TO_DATE( '31-12-2009', 'FXDD-MM-RRRR' ) *, который предотвратит применение правил преобразования строки в дату и потребует, чтобы входные данные точно соответствовали модели формата.
0 голосов
/ 04 декабря 2018

Неправильный формат маски.Ни 12 = mon (это mm), ни 2009 = RR (это RRRR).

Переключиться на

create table customer1
(
custmer_id number, 
Customer_name varchar(20), 
Expiry_date  date default TO_DATE ('31-12-2009','dd-mm-RRRR')
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...