2013-04-14 94 views
4

SQL Server 2012自身可以自动计算列吗?SQL Server 2012中的自动计算列

例如:我有三列START_DATE,END_DATEDURATION

我想这样做是为了获得时间:

DURATION = END_DATE - START_DATE 

所以我得到了持续的天数。

SQL Server 2012可以在记录创建时自动执行它吗?

回答

5

是的,肯定的 - 只要定义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关键字。这意味着:每次访问该列(询问其值)时,都会再次进行计算。

+0

非常感谢你。例如,如果我想要今天的日期,那么您如何执行相同的计算而不是END_DATE,即“今天的日期 - start_date”? – Brian

+0

我试过的是这样的:'ALTER TABLE dbo.users ADD age AS DATEDIFF(YEAR,CAST(GETDATE()AS DATE),date_of_birth)PERSISTED',但是我得到这个错误:''用户表中'计算列'age' '不能持续,因为该列是非确定性的。' – Brian

+0

@Brian:使用'GETDATE()'是问题 - 这是非确定性的,所以你不能坚持这个值。如果您必须**使用'GETDATE()',那么您必须省略'PERSISTED'关键字,并且每次访问列时都会计算该值。 –

0

在您的表格设计中,在计算列规范下输入(Formula)中的任何一个,以获得您所需的结果。

对于日期的差异:

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