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'關鍵字,並且每次訪問列時都會計算該值。 –