Sql 如何创建从另一列计算的列?
我需要在SQL Server数据库中创建一列Sql 如何创建从另一列计算的列?,sql,sql-server-2008,Sql,Sql Server 2008,我需要在SQL Server数据库中创建一列age 应根据列DOB的值计算此列的值 它的值也应该随着年龄的增加而增加。您应该使用计算列来解决这个问题。定义与此类似的东西: ALTER TABLE Customers ADD Age AS datediff(year, DOB ,getdate()) 原始声明摘自,更多信息请访问 编辑: MSDN将计算列解释为: 计算列是从可以使用其他 同一表中的列。表达式可以是非计算列 名称、常量、函数以及通过 一个或多个操作员。表达式不能是子查询 除非另有规
age
应根据列DOB
的值计算此列的值
它的值也应该随着年龄的增加而增加。您应该使用计算列来解决这个问题。定义与此类似的东西:
ALTER TABLE Customers ADD Age AS datediff(year, DOB ,getdate())
原始声明摘自,更多信息请访问
编辑:
MSDN将计算列解释为:
计算列是从可以使用其他
同一表中的列。表达式可以是非计算列
名称、常量、函数以及通过
一个或多个操作员。表达式不能是子查询
除非另有规定,否则计算列是
未实际存储在表中。它们的值将重新计算
每次在查询中引用它们时。数据库引擎使用
CREATE TABLE和ALTER TABLE语句中的持久化关键字
在表中物理存储计算列。他们的价值观是
当计算中的任何列发生更改时更新。通过
将计算列标记为持久化,可以在
确定但不精确的计算列。另外,,
如果计算列引用CLR函数,则数据库引擎
无法验证函数是否真正具有确定性。在这个
在这种情况下,必须持久化计算列,以便可以创建索引
在上面创建。有关详细信息,请参见在计算机上创建索引
列
计算列可用于select列表、WHERE子句、ORDER BY
子句,或可以使用正则表达式的任何其他位置
已使用,但以下情况除外:
必须标记用作CHECK、外键或NOTNULL约束的计算列
坚持。计算列可以用作索引中的键列,也可以用作任何索引的一部分
主键或唯一约束(如果计算列值由
索引中允许确定性表达式和结果的数据类型
列
例如,如果表具有整数列a和b,则计算列a+b可以是
已编制索引,但计算列a+DATEPART(dd,GETDATE())无法编制索引,因为
值可能在后续调用中更改>
计算列不能是INSERT或UPDATE语句的目标
数据库引擎会自动确定
基于使用的表达式计算列。大多数的结果
即使只有不可为空的列,表达式也被视为可为空
存在,因为可能会产生下溢或溢流
空结果也是如此。将COLUMNPROPERTY函数与
AllowsNull属性以调查任何计算
表中的列。可以将可为null的表达式转换为
通过指定ISNULL(检查_表达式,常量)不可为空,
其中,常数是一个非空值,用于替换任何空结果
来源:这是获得年龄的正确方法:
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
alter table将年龄添加为datediff(year,DOB,getdate())-如果月份(DOB)*32+天(DOB)>月份(getdate())*32+天(getdate()),则1结束
代码片段
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()) )
那么新添加的行呢?只有当您选择表的值时,或者更确切地说,当您访问任何人都会知道年龄是否为最新时,才可以。因此,您可以使用触发器/存储过程来执行此操作。。不是吗?我只需在表的顶部创建一个视图,视图定义的最后一列为
datediff(yy,DOB,getUTCDate())
。创建一个计算年龄的视图。没有必要存储此类信息。哦,看,一个家庭作业问题:-)我建议你也在这里添加一些信息,而不仅仅是链接。就像什么是计算列一样,这可以被验证,可以被索引,等等。我冒昧地引用了MSDNvery很好的描述,但它确实找不到年龄。它发现了两个日期之间的全年差异。DOB='2012-12-31',getdate()='2013-01-01'=1年