SQL Server 2012是否可以自动计算列呢?
例如:我有三列START_DATE
,END_DATE
和DURATION
。
我想通过以下方式获得持续时间:
DURATION = END_DATE - START_DATE
我需要以天数的形式获取时长。
在记录创建时,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
关键字。这意味着:每次访问该列(请求其值)时,都会重新计算。
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
ALTER TABLE dbo.users ADD age AS DATEDIFF(YEAR, CAST(GETDATE() AS DATE), date_of_birth) PERSISTED
但是我遇到了这个错误:无法持续计算列“users”表中的“age”,因为该列是非确定性的。
- BrianGETDATE()
是问题所在 - 这是不确定的,因此您无法持久化该值。如果您必须使用GETDATE()
,那么您必须省略PERSISTED
关键字,每次访问列时都会计算该值。 - marc_sDATEDIFF(YEAR
计算年龄并不是一种可靠的方法,对吧?这本质上将每个人的生日视为1月1日。 - Aaron Bertrand