私は、多くのクライアントを追跡するMS-SQL Serverを持っています。誕生日がわかっている場合は、dayOfBirth
という日時属性として格納されます。今私はクライアントの現在の年齢を追跡する別の属性年齢を持っていると思います。年齢はいつでも変わる可能性があるので、スクリプトがベストアイデアかもしれないと思った。年齢属性を正しく設定するにはどうすればよいですか?
私がやった最初のことは、誕生日をdatetimeとして指定した年齢を計算するストアドプロシージャを作成することでした。その後、私は非ヌルdayOfBirth属性を持つすべてのレコードを実行し、それに応じて満たされた年齢を更新し、別のスクリプトを作成し
USE [MyDB]
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE CalculateAge
@dayOfBirth datetime,
@age INT OUTPUT
AS
DECLARE @today datetime, @thisYearBirthDay datetime
DECLARE @years int
SET @today = GETDATE()
SET @thisYearOfBirth = DATEADD(year, @dayOfBirth, @today), @dayOfBirth)
SET @years = DATEDIFF(year, @dayOfBirth, @today) - (CASE WHEN @thisYearBirthDay > @today THEN 1 ELSE 0 END)
SET @age = @years
:ここに私が思い付いたものです。
USE [MyDB]
GO
DECLARE @age int;
DECLARE @birth datetime;
DECLARE @id intl
DECLARE cursorQuery CURSOR FOR SELECT clientId FROM Clients WHERE dayOfBirth IS NOT NULL;
OPEN cursorQuery
FETCH NEXT FROM cursorQuery INTO @id
WHILE @@FETCH_STATUS = 0
BEGIN
SET @birth = (SELECT dayOfBirth from Kunden where [email protected]);
EXEC dbo.CalculateAge @birth, @age OUTPUT;
UPDATE Clients SET Age = @age WHERE clientId = @id;
FETCH NEXT FROM cursorQuery INTO @id
END
CLOSE cursorQuery
DEALLOCATE cursorQuery
上記のスクリプトを1日1回トリガーして年齢属性を設定します。今まで私が持っていたことだが、改善の余地が十分あるという気持ちがある。
**私はこのようなものになってしまったおかげで宋マイスター**
:
CREATE TABLE Client (
ID int identity(1,1) primary key,
DOB datetime null,
AGE as (case
when DOB is null then null
else DATEDIFF(YY,DOB,GETDATE()) - CASE WHEN (MONTH(GETDATE()) = MONTH(DOB) AND DAY(DOB) > DAY(GETDATE()) OR MONTH(GETDATE()) > MONTH(DOB)) THEN 1 ELSE 0 END
end
)
)
+1すごくいいですが、計算に何か問題があると思います。まだ知っているかなりきちんとしたこと。私はそれに取り組んでいます。 – raupach
@nooomiさて、スクリプトの全体はデモンストレーションのためのものであり、Ageのデフォルト値を設定する方法は、ヌルの代わりにそれをどのようにしたいかにかかっています – Sung
@Sung私は知っており、非常に感謝しています:) – raupach