SQL TO_DATE - 每个日期字段?

时间:2018-04-30 16:51:16

标签: sql oracle insert to-date

使用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.

我是否真的必须在INSERT语句中的每个DATE字段前放置一个TO_DATE格式,即使它们已经是正确的YYYY-MM-DD格式?

3 个答案:

答案 0 :(得分:3)

好吧,你不必每次都,但是好的做法是说你应该告诉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文字。它始终采用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函数。

答案 1 :(得分:1)

在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'
           );

答案 2 :(得分:0)

使用的默认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。