2013-04-14 102 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