create table Son
(
ID int primary key identity(1,1),
DateOfBirth datetime,
constraint Age check (datediff(year,DateOfBirth,GetDate())>= 0),
Name nvarchar(50) not null check (len(Name) >= 8) default('Sergio')
)
现在我只是检查一下他的年龄列是否大于0,如果要计算年龄列,我如何声明表?
答案 0 :(得分:4)
您可以引入计算列:
CREATE TABLE Son (
ID int primary key identity(1,1),
DateOfBirth datetime,
Age as DATEDIFF(year,DateOfBirth,GetDate()) - CASE WHEN DATEPART(month,DateOfBirth) > DATEPART(month,GetDate()) THEN 1 WHEN DATEPART(month,DateOfBirth) = DATEPART(month,GetDate()) And DATEPART(day,DateOfBirth) > DATEPART(day,GetDate()) THEN 1 ELSE 0 END
/* Other columns */
)
我认为该公式是正确的 - DATEDIFF简单测量边界过渡(12月31日 - > 1月1日),因此您还需要比较月和日,否则12月31日出生的人一天后的1岁。
答案 1 :(得分:0)
我首先要创建一个计算年龄的函数。这为您提供了可在其他表上重复使用的内容,并且可以在您可能想要计算特定日期的人员年龄的情况下使用。例如,我想在今年晚些时候举办一个派对,我想知道那个将在该日达到法定年龄的人向他们发送邀请。
然后创建表并添加引用该函数的计算列。添加年龄和给定名称长度等的检查约束
你应该警惕,通过使用一个函数,你不能在不删除表中的引用(即计算列)的情况下改变这个函数。
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