2016-12-01 35 views
1

我具有低於其具有3列Student_NameJoining_DateBatch_NumberCourseBatch_Number根據Joining_Date連接月份,日期和年份從Joining_Date計算得出。在數據庫是否可以使用正在更新的列值來更新SQL Server中表中的另一列?

一個條目看起來像什麼:

Aman | 01/08/2016 | 08012016 

我想更新Joining_Date說2017年1月8日,想在短短的一個查詢基於Joining_Date更新Batch_Number

我能實現的兩個步驟:

第一步:

UPDATE Course 
SET Joining_Date = DATEADD(YEAR, 1, Joining_Date) 
WHERE Student_Name = 'Aman' 

第二步:

UPDATE Course 
SET Batch_Number = CONCAT(RIGHT('0' + RTRIM(DATEPART(MM,Joining_Date)), 2), RIGHT('0' + RTRIM(DATEPART(DD,Joining_Date)), 2), DATEPART(YYYY,Joining_Date)) 
WHERE Student_Name = 'Aman' 

我想要實現一步到位上面的事情。因此,儘管嘗試:

UPDATE Course 
SET Joining_Date = DATEADD(YEAR, 1, Joining_Date), 
    Batch_Number = CONCAT(RIGHT('0' + RTRIM(DATEPART(MM,Joining_Date)), 2), RIGHT('0' + RTRIM(DATEPART(DD,Joining_Date)), 2), DATEPART(YYYY,Joining_Date)) 
WHERE Student_Name = 'Aman' 

它沒有更新Batch_Number和它使用的Joining_Date舊值這麼Batch_Number保持不變。

是否可以更新一杆Joining_DateBatch_Number

早期的反應將不勝感激。

在此先感謝讀者!

回答

0

是的,你可以在你的UPDATE語句另一列使用相同的表達式爲Joining_Date列(DATEADD(YEAR, 1, Joining_Date))以及不是列本身的像

UPDATE Course 
SET Joining_Date = DATEADD(YEAR, 1, Joining_Date), 
Batch_Number = CONCAT(RIGHT('0' + RTRIM(DATEPART(MM,DATEADD(YEAR, 1, Joining_Date))) .... 
WHERE Student_Name = 'Aman' 
+0

它的工作夥計!不知道爲什麼在這裏發佈這個冗長的問題之前我沒有想到。 謝謝你們你搖滾! –

0
UPDATE Course SET Joining_Date = DATEADD(YEAR, 1, Joining_Date), 
Batch_Number = CONCAT(RIGHT('0' + RTRIM(DATEPART(MM,DATEADD(YEAR, 1, Joining_Date))), 2), 
RIGHT('0' + RTRIM(DATEPART(DD,DATEADD(YEAR, 1, Joining_Date))), 2), 
DATEPART(YYYY,DATEADD(YEAR, 1, Joining_Date))) 
WHERE Student_Name = 'Aman' 
+0

它的作用!不知道爲什麼在這裏發佈這個冗長的問題之前我沒有想到。 謝謝你們你搖滾! –

0

1 CTE

DECLARE @course TABLE 
(
    id INT IDENTITY(1,1) NOT NULL, 
    Joining_Date DATE NOT NULL, 
    Batch_Number VARCHAR(100) NULL 
) 

INSERT INTO @course(Joining_Date) 
VALUES ('20150401'), ('19951121'), ('20000229') 

;with cteCourse as 
(
    SELECT 
     DATEADD(YEAR, 1, cr.Joining_Date) as Joining_Date_new, 
     cr.Joining_Date, 
     cr.Batch_Number 
    FROM @course cr 
    --WHERE cr.Student_Name = 'Aman' 
) 
UPDATE cr SET 
    Joining_Date = Joining_Date_new, 
    Batch_Number = CONCAT(RIGHT('0' + RTRIM(DATEPART(MM,Joining_Date_new)), 2), RIGHT('0' + RTRIM(DATEPART(DD,Joining_Date_new)), 2), DATEPART(YYYY,Joining_Date_new)) 
FROM cteCourse cr 


SELECT * FROM @course 
ORDER BY 1 

2 OLD-SCHOOL VAR TRICK

DECLARE @course TABLE 
(
    id INT IDENTITY(1,1) NOT NULL, 
    Joining_Date DATE NOT NULL, 
    Batch_Number VARCHAR(100) NULL 
) 

INSERT INTO @course(Joining_Date) 
VALUES ('20150401'), ('19951121'), ('20000229') 

DECLARE @Joining_Date_new DATE 

UPDATE cr SET 
    @Joining_Date_new = DATEADD(YEAR, 1, cr.Joining_Date), 
    Joining_Date = @Joining_Date_new, 
    Batch_Number = CONCAT(RIGHT('0' + RTRIM(DATEPART(MM,@Joining_Date_new)), 2), RIGHT('0' + RTRIM(DATEPART(DD,@Joining_Date_new)), 2), DATEPART(YYYY,@Joining_Date_new)) 
FROM @course cr 


SELECT * FROM @course 
ORDER BY 1 

兩種方式相同的結果:

enter image description here

+0

它的作用!不知道爲什麼在這裏發佈這個冗長的問題之前我沒有想到。 謝謝你們你搖滾! –

0

你可能只是很輕鬆地將計算列添加到您的表的基礎上,Joining_Date,以及在你的觸發更新第二列做了。 ....

這樣做:

ALTER TABLE dbo.Course 
ADD BatchNo AS FORMAT(Joining_Date, 'MMddyyyy') 

這將格式化「加入日期」,以日 - 月 - 咋ar - 就像你想要的那樣 - 並且這將保持最新並且始終正確。所以在你的觸發器中,你只需簡單地更改Joining_Date和賓果遊戲 - 你就完成了!BatchNo將自動更新您的Joining_date列後正確...

相關問題