【问题标题】:pl/sql oracle print out employee duration in years, months, dayspl/sql oracle 以年、月、日为单位打印员工工期
【发布时间】:2022-01-08 13:45:09
【问题描述】:

我已经定义了这个函数:

CREATE OR REPLACE FUNCTION oz_hire_duration(hiredate IN DATE)
    RETURN VARCHAR2
    IS workexperience VARCHAR2(30);

BEGIN
    workexperience := TRUNC(MONTHS_BETWEEN(SYSDATE, hiredate)/12) || 'years ' ||
    MOD(TRUNC(MONTHS_BETWEEN(SYSDATE, hiredate)), 12) || ' month '||
    TRUNC(SYSDATE - ADD_MONTHS(hiredate, TRUNC(MONTHS_BETWEEN(SYSDATE, hiredate)))) || 'days';

RETURN workexperience;
END;

我不知道为什么它总是给我错误,有人可以帮忙吗?

这是我在编译这个函数时得到的错误信息:

ORA-06575:包或函数 OZ_HIRE_DURATION 处于无效状态

错误:FUNCTION OZ_HIRE_DURATION 行/列:8/21 PLS-00103: 在预期以下情况之一时遇到符号“-”:

. ( ) , * @ % & = - + < / > at in is mod remainder not rem =>
<an exponent (**)> <> or != or ~= >= <= <> and or default
like like2 like4 likec as between from using || multiset
member submultiset The symbol ". was inserted before "-" to continue.

谢谢

enter image description here

【问题讨论】:

  • “持续时间(年、月、日)”没有明确定义。例如:从 2019 年 2 月 28 日到 2020 年 2 月 29 日 - 那是一年零一天,还是正好是一年?您必须为所有此类例外情况指定一个非常清晰、明确的定义。除了不幸的是,没有这样的规则集同时涵盖所有可能的情况并且不自相矛盾。所以……祝你这项任务好运!
  • 它编译并运行良好(DBFiddle)。

标签: oracle plsql


【解决方案1】:

只需输入以下选择语句而不是您的计算。

我的想法是按顺序计算年、月和日。

SELECT vyears || ' years ' || vmonth || ' months ' || FLOOR(SYSDATE - add_months(hiredate, (vyears * 12) + vmonth)) || ' days' AS workexperience
INTO WorkExperience
FROM (SELECT SYSDATE,
                         vyears,
                         FLOOR(MONTHS_BETWEEN(SYSDATE, hiredate)) - (vyears * 12) vmonth
                FROM (SELECT SYSDATE,
                                         FLOOR(MONTHS_BETWEEN(SYSDATE, hiredate) / 12) vyears
                                FROM dual));

【讨论】:

    猜你喜欢
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多