PL / SQL检查数字是否为整数

时间:2014-01-12 10:17:46

标签: oracle plsql oracle11g

我想查看我的员工表是否有任何员工作为员工 员工一年或两年,或三年,...... 我现在的问题是,我不知道如何检查数字是否是 是否为整数。

CREATE OR REPLACE PROCEDURE jubilar
IS
  v_cur_date DATE := TO_DATE('03-JAN-2012');
  v_cur_year NUMBER;
  v_first_name employees.first_name%TYPE;
  v_last_name employees.last_name%TYPE;
  v_hire_date employees.hire_date%TYPE;
  CURSOR c_emp_cursor IS
    SELECT first_name, last_name, hire_date FROM employees;
BEGIN
  OPEN c_emp_cursor;
  LOOP
    FETCH c_emp_cursor INTO v_first_name, v_last_name, v_hire_date;
    EXIT WHEN c_emp_cursor%NOTFOUND;
    v_cur_year := round((v_cur_date - v_hire_date) / 365, 1);
    IF v_cur_year ???
      DBMS_OUTPUT.PUT_LINE(v_first_name || ' ' || v_last_name || ' ist heute ' || v_cur_year || ' Jahre im Unternehmen tätig.');
    END IF;
  END LOOP;
  CLOSE c_emp_cursor;
END jubilar;
/

在这一行

IF v_cur_year ??

我需要检查v_cur_year是否为整数。因为如果是员工 作为一名员工正好适用于X年。我需要知道这一点。

编辑:

我试过了:

CREATE OR REPLACE PROCEDURE jubilar
IS
  v_cur_date DATE := TO_DATE('03/01/12', 'dd/mm/yy');
  v_cur_year NUMBER;
  v_cur_year_temp VARCHAR2(100);
  v_first_name employees.first_name%TYPE;
  v_last_name employees.last_name%TYPE;
  v_hire_date employees.hire_date%TYPE;
  CURSOR c_emp_cursor IS SELECT first_name, last_name, hire_date FROM employees;
BEGIN
  OPEN c_emp_cursor;
  LOOP
    FETCH c_emp_cursor INTO v_first_name, v_last_name, v_hire_date;
    EXIT WHEN c_emp_cursor%NOTFOUND;

    v_cur_year := round((v_cur_date - v_hire_date) / 365, 1);
    v_cur_year_temp := TO_CHAR(v_cur_year);

    IF REGEXP_COUNT(v_cur_year_temp, ',') = 0 THEN
      DBMS_OUTPUT.PUT_LINE(v_first_name || ' ' || v_last_name || ' ist heute ' || v_cur_year || ' Jahre im Unternehmen tätig.' || TO_CHAR(v_hire_date));
    END IF;
  END LOOP;
  CLOSE c_emp_cursor;
END jubilar;
/

但是,例如17/01/2005

,它给了我雇用的错误的雇员

我也试过这个:

CREATE OR REPLACE PROCEDURE jubilar
IS
  v_cur_date DATE := TO_DATE('03/01/12', 'dd/mm/yy');
  v_cur_year NUMBER;
  v_first_name employees.first_name%TYPE;
  v_last_name employees.last_name%TYPE;
  v_hire_date employees.hire_date%TYPE;
  CURSOR c_emp_cursor IS SELECT first_name, last_name, hire_date FROM employees;
BEGIN
  OPEN c_emp_cursor;
  LOOP
    FETCH c_emp_cursor INTO v_first_name, v_last_name, v_hire_date;
    EXIT WHEN c_emp_cursor%NOTFOUND;

    v_cur_year := round((v_cur_date - v_hire_date) / 365, 1);

    IF trunc(v_cur_year) = v_cur_year THEN
      DBMS_OUTPUT.PUT_LINE(v_first_name || ' ' || v_last_name || ' ist heute ' || v_cur_year || ' Jahre im Unternehmen tätig.' || TO_CHAR(v_hire_date));
    END IF;
  END LOOP;
  CLOSE c_emp_cursor;
END jubilar;
/

但是,例如17/01/2005

,它给了我雇用的错误的雇员

3 个答案:

答案 0 :(得分:1)

这可能对你有帮助..

   DECLARE
   d1    DATE := TO_DATE ('01/12/12', 'mm/dd/yy');
   d2    DATE := SYSDATE;
   n1    NUMBER;
   chk   VARCHAR2 (100);
    BEGIN
   n1 := ROUND ( (d2 - d1) / 365, 1);
   DBMS_OUTPUT.put_line (n1);
   chk := TO_CHAR (n1);
   DBMS_OUTPUT.put_line (chk);

   IF REGEXP_COUNT (chk, '.') != 0
    THEN
      ---YOUR LOGIC
    END IF;
END;

答案 1 :(得分:0)

检查在两年内工作两年的员工。 1月14日,您可以使用:

select *
from employees
where months_between(DATE '2014-01-14', trunc(hire_date)) / 12 = 2;

(我更喜欢在to_date()函数上使用ANSI日期文字。适用于多个DBMS且输入较少)

months_between(...) / 12如果不是一年就会产生小数值,因此与非小数值的比较将会失败。

只需更改比较日期(DATE '2014-01-14')和条件(=2)即可适应其他日期或持续时间。

SQLFiddle示例:http://sqlfiddle.com/#!4/27c3d/4

答案 2 :(得分:0)

我会这样做:

with y as 
   (select trunc(ADD_MONTHS(SYSDATE, -12 * LEVEL)) as the_date, LEVEL as anniversary
   from dual
   connect by LEVEL <= 6)
select first_name, last_name, hire_date, anniversary, the_date
   join y on  the_date = hire_date