在我看来,您发布的任何内容都不会返回 ORA-01848。它通常与 DDD 日期格式掩码相关,它表示一年中的天数。
例如,这是正确的,因为日期编号 001 等于 1 月 1 日:
SQL> select to_date('001-2020', 'ddd-yyyy') from dual;
TO_DATE('0
----------
01.01.2020
这会返回 ORA-01848,因为在这一年(也没有任何一年)没有第 405 天:
SQL> select to_date('405-2020', 'ddd-yyyy') from dual;
select to_date('405-2020', 'ddd-yyyy') from dual
*
ERROR at line 1:
ORA-01848: day of year must be between 1 and 365 (366 for leap year)
所以:如果您正在做这样的事情,请确保存储的值是正确的;我想不是所有的都是。
此外,当人们将日期作为字符串存储到 VARCHAR2(而不是 DATE 数据类型)列时,就会发生这种情况。我不是说你是原因,但你肯定是这里的受害者。
[编辑]
朱利安日期,嗯?在评论中,您说您使用了这样的查询:
Select TO_CHAR(TO_DATE(Julian_dateColumn+1900000, 'YYDDD'), 'YYDDD'), 'DD/MM/YYYY') as column_d from sometable
我怀疑它是无效的(我想你有多余的, 'YYDDD'))。
无论如何,我不知道你为什么试图以这种方式“转换”朱利安日期。有一种简单而正确的方法可以做到这一点。方法如下:
这是今天的日期 (21.05.2020),以儒略日期表示:
SQL> select to_char(sysdate, 'j') julian from dual;
JULIAN
-------
2458991
这是您存储在表中的值。为了将其转换为您想要的格式 (yyddd),您需要
SQL> select to_char(to_date(2458991, 'j'), 'yyddd') as column_d from dual;
COLUM
-----
20142
我建议您使用它而不是您当前拥有的代码,即
SQL> create or replace view table_d as
2 select to_char(to_date(julian_datecolumn, 'j'), 'yyddd') as column_d
3 from sometable;
View created.
SQL> select * From table_d;
COLUM
-----
20142
SQL>