SQL Server 2012自身可以自动计算列吗?SQL Server 2012中的自动计算列
例如:我有三列START_DATE
,END_DATE
和DURATION
。
我想这样做是为了获得时间:
DURATION = END_DATE - START_DATE
所以我得到了持续的天数。
SQL Server 2012可以在记录创建时自动执行它吗?
SQL Server 2012自身可以自动计算列吗?SQL Server 2012中的自动计算列
例如:我有三列START_DATE
,END_DATE
和DURATION
。
我想这样做是为了获得时间:
DURATION = END_DATE - START_DATE
所以我得到了持续的天数。
SQL Server 2012可以在记录创建时自动执行它吗?
是的,肯定的 - 只要定义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
关键字。这意味着:每次访问该列(询问其值)时,都会再次进行计算。
在您的表格设计中,在计算列规范下输入(Formula)
中的任何一个,以获得您所需的结果。
对于日期的差异:
CAST(job_end - job_start) AS TIME(0))
时间期限:
SUBSTRING(CONVERT(VARCHAR(20),(END_DATE-START_DATE),120),12,8)
同样可以计算为Second
,Minute
,Hour
,Month
,Year
差异。
语法使用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
非常感谢你。例如,如果我想要今天的日期,那么您如何执行相同的计算而不是END_DATE,即“今天的日期 - start_date”? – Brian
我试过的是这样的:'ALTER TABLE dbo.users ADD age AS DATEDIFF(YEAR,CAST(GETDATE()AS DATE),date_of_birth)PERSISTED',但是我得到这个错误:''用户表中'计算列'age' '不能持续,因为该列是非确定性的。' – Brian
@Brian:使用'GETDATE()'是问题 - 这是非确定性的,所以你不能坚持这个值。如果您必须**使用'GETDATE()',那么您必须省略'PERSISTED'关键字,并且每次访问列时都会计算该值。 –