SQL Server 2012中的自动计算列

5

SQL Server 2012是否可以自动计算列呢?

例如:我有三列START_DATEEND_DATEDURATION

我想通过以下方式获得持续时间:

DURATION = END_DATE - START_DATE

我需要以天数的形式获取时长。

在记录创建时,SQL Server 2012是否可以自动完成此操作?

2个回答

7

是的,当然可以 - 只需将 Duration 定义为计算列:

ALTER TABLE dbo.YourTable
ADD Duration AS DATEDIFF(DAY, START_DATE, END_DATE) PERSISTED

现在你可以开始了。现在Duration将始终显示这两列之间的差异(以天为单位)。如果使用PERSISTED关键字,则计算出的值将与其他列值一起存储。如果任何一列“依赖”的列发生更改,此列也将被更新。

更新:如果您想要获取日期和今天之间的差异,可以使用

ALTER TABLE dbo.YourTable
ADD Duration AS DATEDIFF(DAY, START_DATE, GETDATE()) 

但不幸的是,由于GETDATE()函数是不确定性的(毕竟-每次调用它时返回值都会改变),您不能使用PERSISTED关键字。这意味着:每次访问该列(请求其值)时,都会重新计算。


我尝试的是这个:ALTER TABLE dbo.users ADD age AS DATEDIFF(YEAR, CAST(GETDATE() AS DATE), date_of_birth) PERSISTED但是我遇到了这个错误: 无法持续计算列“users”表中的“age”,因为该列是非确定性的。 - Brian
@Brian:使用 GETDATE() 是问题所在 - 这是不确定的,因此您无法持久化该值。如果您必须使用 GETDATE(),那么您必须省略 PERSISTED 关键字,每次访问列时都会计算该值。 - marc_s
1
@Brian:不幸的是,不能。由于当前日期(包括时间部分)始终是不确定的,因此您真的无法这样做... - marc_s
1
@Brian 不需要,但你绝对需要将它持久化吗?既然这个值每天都会变化,将其持久化没有意义。 - Aaron Bertrand
1
@Brian,您也知道使用 DATEDIFF(YEAR 计算年龄并不是一种可靠的方法,对吧?这本质上将每个人的生日视为1月1日。 - Aaron Bertrand
显示剩余2条评论

1
在您的表设计中,为了得到所需的结果,在“计算列规范”下的“(公式)”中输入以下任何一项。
对于日期差异:
CAST(job_end - job_start) AS TIME(0))

关于时间持续的内容:
SUBSTRING(CONVERT(VARCHAR(20),(END_DATE-START_DATE),120),12,8)

同样地,您可以计算SecondMinuteHourMonthYear的差异。
使用DATEDIFF的语法如下:
DATEDIFF ( datepart , startdate , enddate )

供您参考:

DATEDIFF(SECOND, GETDATE(), GETDATE() + 1) AS SecondDifference
DATEDIFF(MINUTE, GETDATE(), GETDATE() + 1) AS MinuteDifference
DATEDIFF(HOUR, GETDATE(), GETDATE() + 1) AS HourDifference
DATEDIFF(DAY, GETDATE(), GETDATE() + 1) AS DayDifference
DATEDIFF(WEEK, GETDATE(), GETDATE() + 1) AS WeekDifference

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接