当我在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_fronting3
和rdf_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
中使用任何空,那么使用内部连接而不是外部连接-它将跳过没有匹配的行。