使用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格式?
答案 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。