5

我需要age在 SQL Server 数据库中创建一个列。

此列的值应根据该列的值计算DOB

它的值也应该随着增加而Age增加。

4

4 回答 4

10

您应该使用计算列来解决此问题。定义与此类似的东西:

ALTER TABLE Customers ADD Age AS datediff(year, DOB ,getdate())

原始声明取自BlackWasp并提供更多信息。

编辑:

MSDN 将计算列解释为:

计算列是根据可以使用同一表中其他列的表达式计算得出的。表达式可以是非计算的列名、常量、函数以及这些由一个或多个运算符连接的任意组合。表达式不能是子查询。

除非另有说明,否则计算列是虚拟列,未物理存储在表中。每次在查询中引用它们时,都会重新计算它们的值。数据库引擎在 CREATE TABLE 和 ALTER TABLE 语句中使用 PERSISTED 关键字将计算列物理存储在表中。当作为其计算一部分的任何列发生更改时,它们的值会更新。通过将计算列标记为 PERSISTED,您可以在计算列上创建确定性但不精确的索引。此外,如果计算列引用 CLR 函数,则数据库引擎无法验证该函数是否真正具有确定性。在这种情况下,计算列必须是 PERSISTED 以便可以在其上创建索引。有关更多信息,请参阅在计算列上创建索引。

计算列可用于选择列表、WHERE 子句、ORDER BY 子句或可以使用正则表达式的任何其他位置,但以下情况除外:

用作 CHECK、FOREIGN KEY 或 NOT NULL 约束的计算列必须标记为 PERSISTED。如果计算列值由确定性表达式定义并且结果的数据类型在索引列中是允许的,则计算列可以用作索引中的键列或任何 PRIMARY KEY 或 UNIQUE 约束的一部分。

例如,如果表具有整数列 a 和 b,则计算列 a + b 可以被索引,但计算列 a + DATEPART(dd, GETDATE()) 不能被索引,因为值可能会在后续调用中更改 >。

计算列不能是 INSERT 或 UPDATE 语句的目标。

数据库引擎根据使用的表达式自动确定计算列的可空性。即使只有不可为空的列存在,大多数表达式的结果也被认为是可空的,因为可能的下溢或溢出也会产生空结果。使用具有 AllowsNull 属性的 COLUMNPROPERTY 函数来调查表中任何计算列的可空性。可以通过指定 ISNULL(check_expression, constant) 将可空表达式转换为不可空表达式,其中常量是替换任何空结果的非空值。

资料来源:MSDN - 计算列

于 2012-11-29T13:05:19.320 回答
4

代码片段

ALTER TABLE
    TheTable
ADD
    DOB AS
    CASE
        WHEN
                MONTH(Birth) > MONTH(ISNULL(Death, SYSDATETIME()))
            OR  (
                        MONTH(Birth) = MONTH(ISNULL(Death, SYSDATETIME()))
                    AND DAY(Birth) >= DAY(ISNULL(Death, SYSDATETIME()))
                )
        THEN
            DATEDIFF(YEAR, Birth, ISNULL(Death, SYSDATETIME())) - 1
        ELSE
            DATEDIFF(YEAR, Birth, ISNULL(Death, SYSDATETIME()))
    END
于 2014-03-05T13:30:27.880 回答
2

使用自动生成的列创建表,

CREATE TABLE Person2
(Id int IDENTITY(1,1) NOT NULL, Name nvarchar(50),
DOB date, Age AS DATEDIFF(YEAR, DOB ,GETDATE()) )
于 2015-07-07T04:58:35.137 回答
1

这是获取年龄的正确方法:

alter table <yourtable> add age as datediff(year, DOB, getdate())- case when month(DOB)*32 + day(DOB) > month(getdate()) * 32 + day(getdate()) then 1 else 0 end
于 2012-11-29T13:34:48.110 回答