带有输入参数的 Oracle 日期格式 - PL SQL

Oracle Date Format with input Parametres - PLSQL

我收到如下错误: ORA-01858 - 在需要数字字符的地方发现了非数字字符。 虽然它不是很准确,但我相信它与以下几行中的日期格式有关。

ELSIF par_report_eff_date_start IS NOT NULL AND par_report_eff_date_start = to_date(par_report_eff_date_start, 'fxdd-mm-yyyy')

ELSIF par_report_eff_date_end IS NOT NULL AND par_report_eff_date_end = to_date( par_report_eff_date_end ,'fxDD-MM-YYYY')

我正在尝试获取参数以在传入时以 'dd/mm/yyyy' 的格式呈现日期,但我不确定如何解决这个问题。

我看过了,但工作时网络访问受限,所以我无法使用常规网站。

       procedure collect_mon_comm_bal_data_part (
  par_report_eff_date_start DATE DEFAULT NULL, --dd/mm/yyyy;
  par_report_eff_date_end  DATE DEFAULT NULL) --dd/mm/yyyy;
  is 

v_report_eff_date_start DATE;
v_report_eff_date_end DATE;

BEGIN

  IF par_report_eff_date_start IS NULL 
    THEN 
    -- Oracle job runs at the beginning of each month
      select trunc(trunc(sysdate,'Mon')-1,'Mon')
      into v_report_eff_date_start
      from dual;   -- Start of month Var
    ELSIF par_report_eff_date_start IS NOT NULL AND par_report_eff_date_start = to_char(par_report_eff_date_start, 'fxdd/mm/yyyy')
        THEN
          v_report_eff_date_start := par_report_eff_date_start;
          DBMS_OUTPUT.PUT_LINE(par_report_eff_date_start || 'Is The Start Date');
    ELSE  
          DBMS_OUTPUT.PUT_LINE(par_report_eff_date_start || 'Is is the wrong format, needs tp be in dd/mm/yyyy'); 
          GOTO the_end;
  END IF;


  IF par_report_eff_date_end IS NULL 
    THEN 
    -- Oracle job runs at the beginning of each month
      select  trunc(sysdate,'MM')-1
      into v_report_eff_date_end
      from dual;   -- Start of month Var
    ELSIF par_report_eff_date_end IS NOT NULL AND par_report_eff_date_end = to_char(par_report_eff_date_end, 'fxdd/mm/yyyy')
        THEN
          v_report_eff_date_end := par_report_eff_date_end;
          DBMS_OUTPUT.PUT_LINE(par_report_eff_date_end || 'Is The Start Date');
     ELSE
          DBMS_OUTPUT.PUT_LINE(par_report_eff_date_end || 'Is is the wrong format, needs tp be in dd/mm/yyyy');
            GOTO the_end;
  END IF;
END;

您不想将 date 转换为 date。你想把它转换成一个字符串。所以尝试:

to_char(par_report_eff_date_start, 'fxdd-mm-yyyy')

我不确定其余的逻辑应该做什么。但是,您使用 to_date() 将值 转换为 日期,并使用 to_char() 将值转换为字符串。

我注意到您有参数 par_report_eff_date_start 和一个变量 v_report_eff_date_start。您可能想要比较以下行中的那些:

ELSIF par_report_eff_date_start 不为空且 par_report_eff_date_start = to_char(par_report_eff_date_start, 'fxdd/mm/yyyy')

但现在您要将日期 参数 与从参数值派生的文本值进行比较。我不认为那是你想要的。 日期只是一个日期,在将其转换为另一种数据类型(如 VARCHAR2)时,您只需考虑格式掩码。 那么为什么不使用:

ELSIF par_report_eff_date_start 不是 NULL AND trunc(par_report_eff_date_start) = trunc(sysdate, 'Mon')

我已经将 trunc() 添加到参数值中,并且因为您想要每月的第一天(我猜!!),trunc(sysdate, 'Mon') 就可以了。

谢谢你 Gordon,我想我已经找到解决方法了。

       procedure collect_mon_comm_bal_data_part (   
    par_report_eff_date_start VARCHAR2 DEFAULT NULL, --dd/mm/yyyy;  
 par_report_eff_date_end  VARCHAR2 DEFAULT NULL) --dd/mm/yyyy;   is 

        v_report_eff_date_start DATE; v_report_eff_date_end DATE;

        BEGIN

          IF par_report_eff_date_start IS NULL 
            THEN 
            -- Oracle job runs at the beginning of each month
              select trunc(trunc(sysdate,'Mon')-1,'Mon')
              into v_report_eff_date_start
              from dual;   -- Start of month Var
            ELSIF par_report_eff_date_start IS NOT NULL AND to_date(par_report_eff_date_start, 'dd/mm/yyyy') = to_date(par_report_eff_date_start,'fxdd/mm/yyyy') 
                THEN
                  v_report_eff_date_start := to_date(par_report_eff_date_start, 'dd/mm/yyyy');
                  DBMS_OUTPUT.PUT_LINE(par_report_eff_date_start || 'Is The Start Date');
            ELSE  
                  DBMS_OUTPUT.PUT_LINE(par_report_eff_date_start || 'Is is the wrong format, needs tp be in dd/mm/yyyy'); 
                  GOTO the_end;   END IF;


          IF par_report_eff_date_end IS NULL 
            THEN 
            -- Oracle job runs at the beginning of each month
              select  trunc(sysdate,'MM')-1
              into v_report_eff_date_end
              from dual;   -- Start of month Var
            ELSIF par_report_eff_date_end IS NOT NULL AND to_date(par_report_eff_date_end, 'dd/mm/yyyy') = to_date(par_report_eff_date_end,'fxdd/mm/yyyy') 
                THEN
                  v_report_eff_date_end := to_date(par_report_eff_date_end, 'dd/mm/yyyy');
                  DBMS_OUTPUT.PUT_LINE(par_report_eff_date_end || 'Is The Start Date');
             ELSE
                  DBMS_OUTPUT.PUT_LINE(par_report_eff_date_end || 'Is is the wrong format, needs tp be in dd/mm/yyyy');
                    GOTO the_end;   END IF;

因此,如果参数为空,我希望它默认为上个月的每月 运行。我希望它 运行 对于选定的日期,如果它们在执行时手动输入,这样我可以 运行 它一年的时间来建立适当的数据样本,该样本将被更新随着它的变化向前发展。

我曾尝试传递虚假日期和空日期,但它们按预期命中了一个月数据的异常或 运行,所以这对我有用。

再次感谢大家,我真的帮了大忙!