2016-12-01 7 views
1

以下のテーブルCourseは、3つのカラムStudent_Name,Joining_DateおよびBatch_Numberを持っています。 Batch_Numberは、Joining_Dateの月、日付、および年の部分を連結して、Joining_Dateに基づいて計算されます。データベース内更新されている列の値を使用して、SQL Serverのテーブル内の別の列を更新できますか?

1つのエントリが何かのようになります。

Aman | 01/08/2016 | 08012016 

は、私が2017年1月8日を言ってJoining_Dateを更新すると、ちょうど1つのクエリでJoining_Dateに基づいてBatch_Numberを更新したいです。

私は2つのステップでそれを達成することができる午前:

第1工程:

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' 

私は1つのステップで上記のことを達成したいです。しようとしたときに、だから:

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を更新していない、それはそうBatch_Numberは同じままJoining_Dateの古い値を使用しています。

Joining_DateBatch_Numberをワンショットで更新することはできますか?

早期の対応に感謝します。

あらかじめ読者に感謝!

答えて

0

はい、あなたは、

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 
のように列そのものの代わりに、他の列のためのあなたの UPDATE文で Joining_Date列( DATEADD(YEAR, 1, Joining_Date))に同じ表現を使用することができます

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に基づいて、あなたのテーブルに計算列を追加し、あなたのトリガーの2番目の列を更新することで離れて行うことができます。 ....

はこれを行います。

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

これは日 - 月 - あなたがたに「入社日」フォーマットしますar - あなたが望むように - これは最新の状態に保たれ、常に修正されます。だからあなたのトリガーでは、単にJoining_Dateとビンゴを変更する - あなたは完了です!BatchNo自動的にあなたのJoining_date列を更新した後に正しいとなるでしょう...

関連する問題