我在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
中会导致此错误?
答案 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_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
中使用任何空值,则使用内部联接而不是外部联接 - 这将跳过没有匹配的行。