2014-01-12 59 views
1

我想檢查我的員工表,如果有任何員工以 員工的身份工作一年或兩年或三年,... 現在的問題對我來說是,我不知道我可以檢查一個數字是否爲 整數或不。PL/SQL檢查是否爲整數

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; 
/

但它給我HIRE_DATE錯的人,例如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; 
/

但是它給了我錯誤的人與hire_date例如17/01/2005

+1

你可以用'如果TRUNC(v_cur_year)= v_cur_year'來檢查,如果數字是整數或沒有。但你將如何處理閏年? – Noel

+0

這不是一個解決方案:(。實際日期是2012年1月3日。使用IF trunc(v_cur_year)= v_cur_year我得到13-JAN-2001 fue 11年,24-DEC-2005 6年,14-Jan - 2007年5年,....我唯一獲得的正確的人是03.01.06 6年 – user1882812

+0

我編輯了我的文章 – user1882812

回答

0

要檢查在例如採用整整兩年的員工誰1月14日,你可以使用這個:

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

(我喜歡用ANSI日期文字在to_date()函數可以使用多個DBMS和少打字)

months_between(...)/12將導致一個分數值,如果它不完全是一年,因此與非小數值的比較將失敗。

只需更改比較日期(DATE '2014-01-14')和條件(=2)以適應其他日期或持續時間。

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

+0

它的工作原理,但我認爲你的意思是months_between(DATE'2014-01-14',hire_date)/ 12 = 2; – user1882812

+0

@ user1882812,當然是,更正。 –

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

不,它不是。如果REGEXP_COUNT(chk,'。')!= 0對於01/12/12和02/12/12是真的,所以它不正確。 – user1882812

+0

將是你的傳入日期格式??在這裏你會尋找整數或不..最好的方法是轉換爲字符和檢查,因爲我們在其他編程語言做.. – user3187076

+0

我編輯我的文章。 – user1882812

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