Как я могу объявить эту таблицу SQL с вычисляемым полем? - PullRequest
2 голосов
/ 24 ноября 2010
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 ]

4 голосов
/ 24 ноября 2010

Вы можете ввести вычисляемый столбец:

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 простые меры для граничных переходов (31 декабря -> 1 января), поэтому вам нужно сравнить месяцы и дни, в противном случаекому-то, родившемуся 31 декабря, исполняется 1 год днем ​​позже.

0 голосов
/ 18 февраля 2014

Я бы начал с создания функции для расчета возраста. Это дает вам возможность многократного использования в других таблицах, а также возможность использования в сценариях, в которых вы можете рассчитывать возраст людей на определенную дату. Например, я собираюсь устроить вечеринку в конце этого года и хочу, чтобы все, кто достиг совершеннолетия в этот день, отправили им приглашение.

Затем создайте свою таблицу и добавьте вычисляемый столбец, который ссылается на эту функцию. Добавьте проверочное ограничение для возраста и длины имени и т. Д.

Вы должны быть осторожны, поскольку, используя функцию, вы не можете изменить эту функцию, не удаляя ссылки из таблицы (то есть вычисляемого столбца).

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...