如何使用计算字段声明此SQL表?

时间:2010-11-24 13:56:13

标签: sql-server tsql

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,如果要计算年龄列,我如何声明表?

2 个答案:

答案 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