根据其他列更新数据

时间:2014-06-13 11:42:44

标签: sql sql-server sql-server-2008 sql-update

我有一个表,想要根据同一个表的其他列更新列。请查看下图,了解表格设计和表格数据。

enter image description here

在这个tbl中,我想按照以下步骤更新JoinDate。

1)如果ModifiedDatetime不为null,则ModifiedDatetime为CreatedDate。

2)现在,如果NextLevel是Hour,那么我想在setp 1中添加上述日期的小时

3)现在,如果NextLevel是Day,那么我想在setp 1中添加上述日期的日期

4)现在,如果NextLevel为Min,那么我想在setp 1中添加上述日期的最小值

5)最后在完成上述所有过程后我将获得的日期,我想用这些数据来更新joindate。

我在光标下面做了这个usig,但是我想用sql update query做这个。

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

谢谢, 亚太区首席技术官Matt

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

要在更新语句中没有游标的情况下执行此操作,那么这应该可以正常工作

    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

答案 2 :(得分:0)

删除列连接,这是多余的。由于joindate总是依赖于同一行中的其他列,所以您需要的只是一个像这样的计算列,否则您将不断维持joindate中的值:

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