Java 在您给出的示例中,SQL开发人员似乎试图将创建函数和运行查询视为一条语句。可能这两个部分之间需要一个/字符,或者在不同的窗口中运行它们。还有一点需要注意:最好使用此函数一次来修复损坏的数据,然后使用简单的来更新,以便进行报告,而不是保留损坏的数据,并在每次
Java 在您给出的示例中,SQL开发人员似乎试图将创建函数和运行查询视为一条语句。可能这两个部分之间需要一个/字符,或者在不同的窗口中运行它们。还有一点需要注意:最好使用此函数一次来修复损坏的数据,然后使用简单的来更新,以便进行报告,而不是保留损坏的数据,并在每次,java,sql,oracle,Java,Sql,Oracle,在您给出的示例中,SQL开发人员似乎试图将创建函数和运行查询视为一条语句。可能这两个部分之间需要一个/字符,或者在不同的窗口中运行它们。还有一点需要注意:最好使用此函数一次来修复损坏的数据,然后使用简单的来更新,以便进行报告,而不是保留损坏的数据,并在每次查询中使用修复功能。@M.Prokhorov-最好更改列数据,然后使用此功能设置一次实际日期值;但是假设数据类型不能更改,那么是的,同意*8-)如果列保持为字符串,那么您也需要停止更多坏数据进入其中。我的意思是,“修复”数据确实意味着创建一个具
在您给出的示例中,SQL开发人员似乎试图将创建函数和运行查询视为一条语句。可能这两个部分之间需要一个
/
字符,或者在不同的窗口中运行它们。还有一点需要注意:最好使用此函数一次来修复损坏的数据,然后使用简单的来更新
,以便进行报告,而不是保留损坏的数据,并在每次查询中使用修复功能。@M.Prokhorov-最好更改列数据,然后使用此功能设置一次实际日期值;但是假设数据类型不能更改,那么是的,同意*8-)如果列保持为字符串,那么您也需要停止更多坏数据进入其中。我的意思是,“修复”数据确实意味着创建一个具有适当数据类型的列,并将所有数据移到那里。所以我们在这里完全同意;你提到的to_date()
把我弄糊涂了。(我猜你的意思是to_char()
,这在上下文中更有意义,请重新阅读你的评论)。我想每个人都同意将其存储为字符串是这里真正的问题*8-)我将此错误作为对shpow结构的响应发布
Exception in component tOracleInput_1
java.sql.SQLDataException: ORA-01847: le jour du mois doit être compris entre 1 et le dernier jour du mois
ORA-01847: "day of month must be between 1 and last day of month"
to_date(datecolumn default null on conversion error, 'yyyymmdd')
create or replace function to_date_safe(p_datestr varchar2) return date
as
l_result date;
invalid_day_for_month exception;
pragma exception_init(invalid_day_for_month, -1847);
pragma udf;
begin
begin
l_result := to_date(p_datestr,'YYYYMMDD');
exception
when invalid_day_for_month then
l_result := last_day(to_date(substr(p_datestr,1,6),'YYYYMM'));
end;
return l_result;
end to_date_safe;
create table demo (datecolumn varchar2(8));
insert all
into demo (datecolumn) values ('20180101')
into demo (datecolumn) values ('20180399')
into demo (datecolumn) values ('20180299')
select * from dual;
with function to_date_safe(p_datestr varchar2) return date
as
invalid_day_for_month exception;
pragma exception_init(invalid_day_for_month, -1847);
l_result date;
begin
begin
l_result := to_date(p_datestr,'YYYYMMDD');
exception
when invalid_day_for_month then
l_result := last_day(to_date(substr(p_datestr,1,6),'YYYYMM'));
end;
return l_result;
end;
select datecolumn
, to_date_safe(datecolumn) as converted_date
from demo
/
DATECOLUMN CONVERTED_DATE
---------- -------------
20180101 01-JAN-2018
20180399 31-MAR-2018
20180299 28-FEB-2018
3 rows selected.
create or replace function updateDate(p_date varchar2) return date as
l_date date;
e_bad_day exception;
pragma exception_init (e_bad_day, -1847);
begin
begin
-- try to convert
l_date := to_date(p_date,'yyyymmdd');
exception
when e_bad_day then
-- ignore the supplied day value and get last day of month
l_date := last_day(to_date(substr(p_date, 1, 6), 'yyyymm'));
end;
return l_date;
end;
/
alter session set nls_date_format = 'YYYY-MM-DD';
with t (dt) as (
select '20180218' from dual
union all select '20160299' from dual
union all select '20180299' from dual
union all select '20160435' from dual
)
select dt, updateDate(dt)
from t;
DT UPDATEDATE
-------- ----------
20180218 2018-02-18
20160299 2016-02-29
20180299 2018-02-28
20160435 2016-04-30