SQL Error: ORA-01841



当我在SQL Developer中运行代码时,我得到以下错误:

SQL Error: ORA-01841: (full) year必须介于-4713和+9999之间,不能为001841. 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中包装select会导致这个错误吗?

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

很可能,您正在查看运行查询的结果,而没有看到它——因为您只查看了前几个结果。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应该不会有年份的转换问题。

您正在将数字(例如201609)转换为使用格式掩码YYYY/MM/DD的日期。在for_fronting3rdf_temp之间也有一个左外连接。对于FRO中的任何行,如果RDF中没有匹配的行,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中使用任何空,那么使用内部连接而不是外部连接-它将跳过没有匹配的行。

最新更新