编写一个代码来检查星期日休息并让所有部分工作正常,除了离开部分

问题描述

我写了一个代码,除了离开和部分不工作之外,一切正常,请给我一些可能对我有帮助的东西

function CF_WEEKRESTFormula return CHAR is
v_rest     number;
gaz_dt     number;
descr      varchar2(90);
gz_dt      date;
AT_P             VARCHAR2(10);
BEGIN
  SELECT week_rest
  INTO   v_rest
  FROM   EMPLOYEES
  WHERE  employee_id1=:employee_id1
  AND    :ATT_DATE between :DATE1 and :DATE2;
  select gazzeted_date,description into gz_dt,descr 
  from gazzeted_days
  where gazzeted_date between :DATE1 and :DATE2;
  select ATT_PRESENT into AT_P 
  from PAY_IN_OUT
  where ATT_PRESENT = 'L' 
  AND  EMP_CODE=:employee_id1
  AND :ATT_DATE between :DATE1 and :DATE2;
  
  IF TO_CHAR( :ATT_DATE,'D' ) = v_rest THEN
    RETURN 'WEEK REST';
  ELSIF
    :ATT_DATE = GZ_DT THEN 
    RETURN DESCR;
  ELSIF AT_P = TO_CHAR(:ATT_DATE) THEN 
    RETURN 'LEAVE';
    ELSE RETURN 'PRESENT';
  END IF;
  exception 
       when No_data_found 
         then return 'a';
END;

除此部分外的所有工作

ELSIF AT_P = TO_CHAR(:ATT_DATE) THEN 
    RETURN 'LEAVE';

它检查 att_date 的 L agt 日期在哪里,如果有 l 然后给 Leave att_date 请给我建议 问候

解决方法

  • AT_Pvarchar2(10)
    • 您正在选择 ATT_PRESENT,但我们不知道它的数据类型 - 大概是一个字符串
    • 当您稍后将其与 :att_date 进行比较时,该 string 可能代表某个日期值
      • 如果是这样,您不应该这样做 - 始终将日期存储到 DATE 数据类型列中
  • :ATT_DATE 看起来像 DATE 数据类型;是吗?还是VARCHAR2
    • 如果它是 DATE,那么对它应用 TO_CHAR 是有意义的,但是缺少 format - 你应该提供它,它应该与返回到 { {1}}
    • 如果它是 at_p,那么再次 VARCHAR2-ing 是没有用的

因此:我认为 - 如果您将格式应用于 TO_CHAR,可能会发生一些积极的。例如,如果 :ATT_DATE:att_date = '03/08/2021' 格式的今天日期):

mm/dd/yyyy

确切的代码取决于实际存储在 elsif at_p = to_char(:att_date,'mm/dd/yyyy') then return 'leave'; at_p 中的内容。