SQL - 无法插入除默认 sysdate 之外的 DATE

SQL - Unable to insert a DATE apart from the default sysdate

我试图将 DATE 值插入我的 table 但是我收到以下错误:

SQL Error: ORA-00984: column not allowed here
00984. 00000 -  "column not allowed here"

这是我的声明:

INSERT INTO TstResults (tstcode, EmpID, fname, sname, tstDate, tstRslt)
VALUES ((Select tstcode from Tests where Freq ='6mnths')
       ,(Select EmpID from Employees where fname = 'Sam')
       ,'Sam'
       ,'Fisher'
       ,01-JUN-15
       ,'A');

每当我输入日期时,都会出现上述错误。在 TstResults 中,tstDate 列的默认值为 sysdate。我可以在 table 中取出数据的唯一方法是从插入语句中删除 tstDate。

在日期前后使用单引号。

INSERT INTO TstResults (tstcode, EmpID, fname, sname, tstDate, tstRslt)
VALUES
( (Select tstcode from Tests where Freq ='6mnths'), (Select EmpID from Employees where fname = 'Sam'), 'Sam', 'Fisher', '01-JUN-15', 'A');

您缺少日期周围的引号:

INSERT INTO TstResults (tstcode, EmpID, fname, sname, tstDate, tstRslt)
VALUES ((Select tstcode from Tests where Freq ='6mnths')
       ,(Select EmpID from Employees where fname = 'Sam')
       ,'Sam'
       ,'Fisher'
       ,'01-JUN-15'
       ,'A');

正如上面评论中 a_horse_with_no_name 所解释的那样,对于硬编码日期,您可能需要使用 date literalDATE '2015-06-15'

另一方面,Oracle 也可以从 strings 转换为 date。如其他答案所示,隐式 使用客户端 NLS_DATE_FORMAT 参数。或者通过使用正确的参数调用 TO_DATE 函数, 显式 。在您的特定情况下:TO_DATE('01-JUN-15', 'DD-MON-YY', 'NLS_DATE_LANGUAGE = American')

使用 implicit 转换似乎 快速简便 但是,请注意 implicit 转换今天可能有效,但将来某些客户端使用不同的设置连接到数据库时会失败(比如客户端具有不同的 locale)。


所以,就我自己而言,我会推动使用日期文字:

INSERT INTO TstResults (tstcode, EmpID, fname, sname, tstDate, tstRslt)
VALUES ((Select tstcode from Tests where Freq ='6mnths')
       ,(Select EmpID from Employees where fname = 'Sam')
       ,'Sam'
       ,'Fisher'
       , DATE '2015-06-15'
       ,'A')

或者,如果您真的不想/不能使用日期文字:

INSERT INTO TstResults (tstcode, EmpID, fname, sname, tstDate, tstRslt)
VALUES ((Select tstcode from Tests where Freq ='6mnths')
       ,(Select EmpID from Employees where fname = 'Sam')
       ,'Sam'
       ,'Fisher'
       ,TO_DATE('01-JUN-15', 'DD-MON-YY', 'NLS_DATE_LANGUAGE = American')
       ,'A')