SQL TO_DATE - для каждого поля даты? - PullRequest
0 голосов
/ 30 апреля 2018

После многих лет использования MySQL, пришлось перенести таблицу в Oracle SQL (я использую SQL Developer). Создал таблицу и теперь просто хотел проверить ее с помощью одного оператора INSERT, получив следующее:

INSERT INTO table_name 
VALUES ('1001','LAWRENCE-INDIANAPOLIS','01-06-02','I8112NP','05DX8105408','2013-06-03','2016-03-11','2018-04-29','2038-01-01','yes','yes','yes','2012-10-25','CCE','7360D33','R8NR6N0','70F63951959F9','2016-03-11')

Error report -
SQL Error: ORA-01861: literal does not match format string
01861. 00000 -  "literal does not match format string"
*Cause:    Literals in the input must be the same length as literals in
           the format string (with the exception of leading whitespace).      
If the "FX" modifier has been toggled on, the literal must match exactly,
       with no extra whitespace.
*Action:   Correct the format string to match the literal.

Действительно ли мне нужно помещать формат TO_DATE перед каждым полем DATE в операторе INSERT, даже если они уже в правильном формате YYYY-MM-DD?

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Что ж, вам не нужно делать это каждый раз , но хорошая практика говорит, что вы должны проинструктировать Oracle, что у вас есть и что вы ожидаете от этого.

Речь идет о настройках NLS. Если формат даты отличается от используемого вами, вы получите сообщение об ошибке (как вы его уже знаете):

SQL> create table test (datum date);

Table created.

SQL> insert into test values ('2013-06-03');
insert into test values ('2013-06-03')
                         *
ERROR at line 1:
ORA-01861: literal does not match format string

Но если вы измените формат даты так, чтобы он соответствовал формату, который вы используете, все будет хорошо:

SQL> alter session set nls_date_format = 'yyyy-mm-dd';

Session altered.

SQL> insert into test values ('2013-06-03');

1 row created.

SQL>

Другой вариант, который не зависит от настроек NLS, - это использовать DATE literal . Он всегда имеет формат YYYY-MM-DD и должен начинаться с ключевого слова DATE:

SQL> alter session set nls_date_format = 'dd.mm.yyyy';

Session altered.

SQL> insert into test values ('2013-06-03');
insert into test values ('2013-06-03')
                         *
ERROR at line 1:
ORA-01861: literal does not match format string


SQL> insert into test values (date '2013-06-03');

1 row created.

SQL>

Или, как вы узнали, используйте функцию TO_DATE с соответствующей маской формата.

0 голосов
/ 30 апреля 2018

Используемый формат DATE по умолчанию зависит от настроек среды NLS_DATE_FORMAT var. Чтобы узнать, что это, используйте следующий запрос:

SELECT *
  FROM V$NLS_PARAMETERS
  ORDER BY PARAMETER;

Это сбросит все параметры NLS, так как они в настоящее время установлены в вашей базе данных. Например, в базе данных, в которой я сейчас работаю, приведенный выше запрос возвращает:

NLS_CALENDAR               GREGORIAN
NLS_CHARACTERSET           US7ASCII
NLS_COMP                   BINARY
NLS_CURRENCY               $
NLS_DATE_FORMAT            DD-MON-RR
NLS_DATE_LANGUAGE          AMERICAN
NLS_DUAL_CURRENCY          $
NLS_ISO_CURRENCY           AMERICA
NLS_LANGUAGE               AMERICAN
NLS_LENGTH_SEMANTICS       BYTE
NLS_NCHAR_CHARACTERSET     AL16UTF16
NLS_NCHAR_CONV_EXCP        FALSE
NLS_NUMERIC_CHARACTERS     .,
NLS_SORT                   BINARY
NLS_TERRITORY              AMERICA
NLS_TIMESTAMP_FORMAT       DD-MON-RR HH.MI.SSXFF AM
NLS_TIMESTAMP_TZ_FORMAT    DD-MON-RR HH.MI.SSXFF AM TZR
NLS_TIME_FORMAT            HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT         HH.MI.SSXFF AM TZR

Так что в моей системе, если бы я хотел ввести строку «дата как символ» и заставить Oracle правильно ее перевести, я должен был бы ввести, например, как. 24-Apr-18.

0 голосов
/ 30 апреля 2018

В Oracle используйте ключевое слово date:

INSERT INTO table_name 
    VALUES ('1001', 'LAWRENCE-INDIANAPOLIS', '01-06-02', 'I8112NP', '05DX8105408',
            DATE '2013-06-03', DATE '2016-03-11', DATE '2018-04-29', DATE '2038-01-01', 'yes', 'yes', 'yes', DATE '2012-10-25', 'CCE', '7360D33', 'R8NR6N0', '70F63951959F9', DATE '2016-03-11'
           );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...