SQL Server 2012中的自动计算列

时间:2013-04-14 12:02:17

标签: sql tsql sql-server-2012 sql-server-2012-express

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

例如:我有三列START_DATEEND_DATEDURATION

我希望通过这样做来获得持续时间:

DURATION = END_DATE - START_DATE

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

SQL Server 2012是否可以在创建记录时自动执行此操作?

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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