Я бы начал с создания функции для расчета возраста. Это дает вам возможность многократного использования в других таблицах, а также возможность использования в сценариях, в которых вы можете рассчитывать возраст людей на определенную дату. Например, я собираюсь устроить вечеринку в конце этого года и хочу, чтобы все, кто достиг совершеннолетия в этот день, отправили им приглашение.
Затем создайте свою таблицу и добавьте вычисляемый столбец, который ссылается на эту функцию. Добавьте проверочное ограничение для возраста и длины имени и т. Д.
Вы должны быть осторожны, поскольку, используя функцию, вы не можете изменить эту функцию, не удаляя ссылки из таблицы (то есть вычисляемого столбца).
CREATE FUNCTION dbo.sfn_GetAge (@BirthDate datetime, @CalcDate datetime)
RETURNS INT
AS
BEGIN
DECLARE @theAge INT
IF Month(@CalcDate) > Month(@BirthDate )
SELECT @theAge= (Year(@CalcDate) - Year(@BirthDate ))
ELSE IF Month(@CalcDate) < Month(@BirthDate )
SELECT @theAge= ((Year(@CalcDate) - Year(@BirthDate )) - 1)
ELSE IF Day(@CalcDate) < Day(@BirthDate )
SELECT @theAge= ((Year(@CalcDate) - Year(@BirthDate )) - 1)
ELSE
SELECT @theAge= (Year(@CalcDate) - Year(@BirthDate ))
RETURN @theAge
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Son](
[ID] INT PRIMARY KEY IDENTITY(1,1),
[GivenName] [nvarchar](50) NOT NULL,
[Surname] [nvarchar](50) NOT NULL,
[DateOfBirth] [date] NOT NULL,
[Age] AS ([dbo].[sfn_GetAge]([DateOfBirth],getdate()))
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Son] ADD CONSTRAINT [DF_Son_GivenName] DEFAULT (N'Sergio') FOR [GivenName]
GO
ALTER TABLE [dbo].[Son] WITH CHECK ADD CONSTRAINT [CK_Son_Age] CHECK (([dbo].[sfn_GetAge]([DateOfBirth],getdate())>=(0)))
GO
ALTER TABLE [dbo].[Son] CHECK CONSTRAINT [CK_Son_Age]
GO
ALTER TABLE [dbo].[Son] WITH CHECK ADD CONSTRAINT [CK_Son_GivenName] CHECK ((len([GivenName])>=(8)))
GO
ALTER TABLE [dbo].[Son] CHECK CONSTRAINT [CK_Son_GivenName]
GO