我需要在SQL Server数据库中创建一个名为age
的列。
这一列的值应该基于DOB
列的值进行计算。
此外,随着Age
的增加,它的值也应该递增。
我需要在SQL Server数据库中创建一个名为age
的列。
这一列的值应该基于DOB
列的值进行计算。
此外,随着Age
的增加,它的值也应该递增。
ALTER TABLE Customers ADD Age AS datediff(year, DOB ,getdate())
原声明摘自并获取更多信息请访问BlackWasp.
编辑:
MSDN将计算列解释为:
计算列是从可以使用同一表中的其他列的表达式计算出来的。该表达式可以是非计算列名称、常量、函数和任何这些组合,由一个或多个运算符连接。表达式不能是子查询。
除非另有说明,否则计算列是虚拟列,不会在表中实际存储。它们的值每次在查询中引用时都会重新计算。数据库引擎在CREATE TABLE和ALTER TABLE语句中使用PERSISTED关键字来物理存储计算列。当它们计算中所涉及的任何列发生变化时,它们的值会更新。通过将计算列标记为PERSISTED,可以在计算列上创建一个确定性但不精确的索引。此外,如果计算列引用CLR函数,则数据库引擎无法验证函数是否真正确定。在这种情况下,必须PERSISTED计算列,以便可以在其上创建索引。有关详细信息,请参阅在计算列上创建索引。
计算列可用于select列表、WHERE子句、ORDER BY子句或任何其他可用正则表达式的位置,但以下情况除外:
计算列用作CHECK、FOREIGN KEY或NOT NULL约束必须标记为PERSISTED。如果计算列值由确定性表达式定义,并且结果数据类型允许在索引列中使用,则可以将计算列用作索引中的关键列或任何PRIMARY KEY或UNIQUE约束的一部分。
例如,如果表具有整数列a和b,则可以索引计算列a + b,但不能索引计算列a + DATEPART(dd, GETDATE()),因为该值可能会在后续调用中更改。
计算列不能成为INSERT或UPDATE语句的目标。
数据库引擎基于所使用的表达式自动确定计算列的可空性。大多数表达式的结果即使只存在不可空列也被认为是可空的,因为可能出现下溢或溢出也会产生null结果。使用COLUMNPROPERTY函数与AllowsNull属性来调查表中任何计算列的可空性。可为空的表达式可以通过指定ISNULL(check_expression,constant)将其转换为不可为空的表达式,其中constant是替代任何null结果的非null值。
代码片段
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
使用自动生成列创建表格
CREATE TABLE Person2
(Id int IDENTITY(1,1) NOT NULL, Name nvarchar(50),
DOB date, Age AS DATEDIFF(YEAR, DOB ,GETDATE()) )
这是获取年龄的正确方式:
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
datediff(yy, DOB, getUTCDate())
。 - Vikdor