2014-06-13 2 views
0

테이블이 있고 같은 테이블의 다른 열을 기반으로 열을 업데이트하고 싶습니다. 테이블 디자인 및 테이블 데이터는 아래 그림을 참조하십시오. 내가 단계 아래로 JoinDate을 업데이트 할이 TBL에서다른 열을 기준으로 데이터 업데이트

enter image description here

.

1) ModifiedDatetime이 null이 아니고 ModifiedDatetime이 아닌 경우 CreatedDate.

2) 이제 NextLevel이 시간은 다음 NextLevel이 날은 우리가 SETP 1이 위의 날짜의 일을 추가 할 지금 경우) 우리는 SETP 1

3을 위 날짜의 시간을 추가 할 경우

4) 이제 NextLevel 최소 그때 우리는 SETP에있는 위의 날짜의 최소를 추가 할 경우 1

마지막으로 내가 얻을 것이다 일 위의 모든 과정을 완료 한 후, 그에 사용할

5) 조인을 갱신 할 데이터.

커서 아래에서이 작업을 수행했지만 SQL 업데이트 쿼리를 사용하여이 작업을 수행합니다. 다음이

UPDATE TBL_EMP 
SET JOINDATE = 
(CASE WHEN MODIFIEDTIME IS NOT NULL 
THEN (CASE WHEN NEXTLEVEL ='Hour' THEN dateadd(hh,1,modifiedtime) 
ELSE (CASE WHEN NEXTLEVEL = 'Day' THEN dateadd(dd,1,MODIFIEDTIME) 
ELSE(CASE WHEN NEXTLEVEL = 'Min' THEN dateadd(n,1,MODIFIEDTIME) ELSE MODIFIEDTIME END) END) END) 
ELSE(CASE WHEN NEXTLEVEL ='Hour' THEN dateadd(hh,1,CREATEDDATE) 
ELSE(CASE WHEN NEXTLEVEL = 'Day' THEN dateadd(dd,1,CREATEDDATE) 
ELSE(CASE WHEN NEXTLEVEL = 'Min' THEN dateadd(n,1,CREATEDDATE) ELSE CREATEDDATE END) END) END) END) 
FROM TBL_EMP 
+1

그래서 이것이 사용자의 요구 사항입니다. 시도해 봤어? –

+0

예 커서를 사용하여이 작업을 수행했지만 커서없이이 작업을 수행하려고합니다. – Hitesh

+0

커서를 사용하여 코드를 게시하십시오. 다른 것이 없으면 질문을 명확히하는 데 도움이됩니다. – Omaer

답변

0

이 시도 , 그것은 과다하다. 조인은 항상 같은 행의 다른 열에 의존하기 때문에 필요한 모든 계산 열이 필요합니다. 그렇지 않으면 계속해서 값을 조인트에 유지해야합니다.

ALTER TABLE YourTable 
ADD cJoindate as 
    CASE NextLevel 
    WHEN 'day' THEN DATEADD(D, 1, COALESCE(ModifiedDate,CreatedDate)) 
    WHEN 'min' THEN DATEADD(MI, 1, COALESCE(ModifiedDate,CreatedDate)) 
    WHEN 'hour' THEN DATEADD(HH, 1, COALESCE(ModifiedDate,CreatedDate)) 
    END 
+0

답장을 보내 주셔서 감사 드리며 정상적으로 작동합니다. – Hitesh

+0

당신은 어떻게 이것을 가진 미래 삽입을 취급 할 는가 것입니다? 매일, 매시간, 매 10 분마다 업데이트를 실행하십시오. 아마 방아쇠를 사용하니? 이 질문에 대한 답변이지만 좋은 방법은 아닙니다. –

+0

@ t-clausen.dk 향후 삽입을 위해 WHERE 절에 조건을 가질 수 있습니다. UPDATE ... ... Where JoinDate가 NULL입니다. –

0

가 업데이트 문에서 커서없이이 작업을 수행하려면 당신의 열 joindate 드롭 :

DECLARE @EmpID INT 
Declare @DtTm datetime 
DECLARE @NextLevl INT 
Declare @JoinDtTm datetime 

DECLARE CurProg CURSOR FOR 
select EmpID from tblEmp 

OPEN CurProg 
FETCH NEXT 
FROM CurProg INTO @EmpID 
WHILE @@FETCH_STATUS = 0 
BEGIN 
select @DtTm = case when ModifiedTime is null then CreatedDate else ModifiedTime end, @NextLevl = NextLevel from tblEmp where EmpID = @EmpID 
if (@NextLevl = 'Min') 
BEGIN 
    set @JoinDtTm = DATEADD(MI,1,@DtTm) 
END 
ELSE IF (@NextLevl= 'Hour') 
BEGIN 
    set @JoinDtTm = DATEADD(HH,1,@DtTm) 
END 
ELSE 
BEGIN 
    set @JoinDtTm = DATEADD(D,1,@DtTm) 
END 
--update tblEmp set JoinDtTm = @JoinDtTm where EMPId= @EMPId 


FETCH NEXT 
FROM CurProg INTO @EmpID 
END 
CLOSE CurProg 
DEALLOCATE CurProg 

감사합니다, Hitesh

0

작동합니다

UPDATE TableName 
SET JoinDate = CASE WHEN NextLevel = 'Hour' THEN DATEADD(HH,1,ISNULL(ModifiedDate,CreatedDate)) 
        WHEN NextLevel = 'Day' THEN DATEADD(DD,1,ISNULL(ModifiedDate,CreatedDate)) 
        WHEN NextLevel = 'Min' THEN DATEADD(MI,1,ISNULL(ModifiedDate,CreatedDate)) 
       END 
관련 문제