问题描述
我写了一个代码,除了离开和部分不工作之外,一切正常,请给我一些可能对我有帮助的东西
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_P
是varchar2(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
中的内容。