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