2016-02-29 21 views
0

我正在爲我的web應用程序編寫一個標量函數。我想計算員工的加入日期和辭職日期之間的日期差異。如何在遊標中使用參數變量SQL

我已經得到了大部分代碼的工作,但我只是無法弄清楚如何在遊標中使用參數變量。

讓說我有這個代碼塊

Declare myCursor Cursor for 

    Declare @join_date datetime 
    Declare @resign_date datetime 
    Declare @emp_stat nvarchar(50) 


    --What I have been trying to do. (Not working) 
    Select @join_date = Convert(datetime, join_date), @emp_stat = Convert(datetime, emp_stat) from t_emp_info where ..... 
    OPEN product_cursor 
     WHILE @@FETCH_STATUS = 0 
    BEGIN 
    if (@emp_stat = 'P') 
     Begin 
      //DateDiff ..... 

     End 

    FETCH NEXT FROM vendor_cursor 
    INTO @join_date , @emp_stat 
    End 
Close myCursor 
DEALLOCATE myCursor; 

我不能得到這個工作,但我要的是我要存儲在參數的值,所以我可以在if條件使用聲明。不知道如何解決這個問題。幫助將不勝感激

+1

你爲什麼使用遊標? – Jeremy

+0

,因爲我試圖循環查看我的表以查看哪個員工具有辭職狀態和當前狀態。員工可以辭職並回來。所以我需要循環,以獲得最新的加入日期。否則,第一天出現在表格中,現在狀態將永遠是他第一次加入的日子(而不是我想要的)例如。 2010年1月1日工作人員加入我們。然後辭職於5/3/2013。 2014年4月5日再次回來。在這種情況下,我希望他的加入日期更改爲4/5/2014而非2010年1月1日。 – RedRocket

+1

你一般都不想循環記錄。這是在SQL中編程的一種不好的方式。 – HLGEM

回答

0

您的光標名稱混淆在一起,您的任務位於錯誤的地方。嘗試:

Declare myCursor Cursor for 
Select join_date, emp_stat, resign_date from t_emp_info where ..... 

Declare @join_date datetime 
Declare @resign_date datetime 
Declare @emp_stat nvarchar(50) 

OPEN myCursor 
FETCH NEXT FROM myCursor 
INTO @join_date , @emp_stat , @resign_date 

    WHILE @@FETCH_STATUS = 0 
BEGIN 
//Your logic here 

FETCH NEXT FROM myCursor 
INTO @join_date , @emp_stat, @resign_date 
End 
Close myCursor 
DEALLOCATE myCursor; 

但是,您應該避免遊標。出什麼問題了:

SELECT DATEDIFF(day, MAX(join_date), case when emp_stat = 'P' then getdate() else MAX(resign_date) end) 
from t_emp_info 
GROUP BY employee_id 

還是類似呢?