SQL错误:ORA-01841

时间:2016-10-18 14:14:04

标签: sql oracle

我在SQL Developer中运行代码时出现以下错误:

  

SQL错误:ORA-01841 :(完整)年份必须介于-4713和+9999之间,而不是0   01841. 00000 - “(完整)年份必须介于-4713和+9999之间,而不是0”

我尝试创建表时遇到此错误。有趣的是,当我在没有create table的情况下执行嵌入式选择时,代码运行正常。

句子是:

 CREATE TABLE TEMP2 AS 
   select  LAST_DAY(TO_DATE(RDF.maxfiledate || '/01','yyyy/mm/dd')) as EXPOS
   from FOR_FRONTING3 FRO 
   left join RDF_TEMP RDF on FRO.POLICYNO = RDF.POLICYNO and FRO.LASTRENW = RDF.LASTRENW;

为什么简单地将选项包装在create table中会导致此错误?

2 个答案:

答案 0 :(得分:1)

首先,相信错误。你的数据不好。

很有可能,您正在查看运行查询而未查看结果的结果 - 因为您只查看前几个结果。 create table在返回之前会在所有行上运行,因此它会找到有问题的行。

原因是这一行:

            then (LAST_DAY(TO_DATE(RDF.maxfiledate || '/01','yyyy/mm/dd')) - RDF.LASTRENW)/RDF.POL_DAYS_ERND 

您应该能够找到违规行:

SELECT *
FROM RDF_TEMP RDF
WHERE NOT REGEXP_LIKE(RDF.maxfiledate, '^[0-9]{4}/') 

如果前四个字符是数字,那么Oracle不应该有的转换问题。

答案 1 :(得分:1)

您正在转换您的号码,例如201609,使用格式掩码YYYY / MM / DD的日期。您还在for_fronting3rdf_temp之间设置了左外联接。对于FRORDF中没有匹配行的任何行,RDF.maxfiledate将评估为null,因此您将执行以下操作:

SELECT TO_DATE(null || '/01','yyyy/mm/dd') as EXPOS FROM DUAL;

Error report -
ORA-01841: (full) year must be between -4713 and +9999, and not be 0

您需要阻止使用空值,例如:

CREATE TABLE TEMP2 AS 
   select  CASE WHEN RDF.maxfiledate IS NOT NULL THEN
     LAST_DAY(TO_DATE(RDF.maxfiledate || '/01','yyyy/mm/dd')) END as EXPOS
   from FOR_FRONTING3 FRO 
   left join RDF_TEMP RDF on FRO.POLICYNO = RDF.POLICYNO and FRO.LASTRENW = RDF.LASTRENW;

您可能最终会得到多个空值,除非您真的在创建/查询中使用其他列,否则这些值可能并非常有用。如果您不想在TEMP2中使用任何空值,则使用内部联接而不是外部联接 - 这将跳过没有匹配的行。

相关问题