2013-07-31 22 views
0

我有一個現有的表,我想添加一個計算列爲什麼CONVERT(TIME(7),expression)不確定?

[dbo].[Route] 
    ... 
    [EstimatedArrival] TIME (7) NOT NULL, 
    [DriveSeconds]  INT  NOT NULL, 
    [WaitSeconds]  INT  NOT NULL, 
    ... 

但是,當我嘗試添加下面

ALTER TABLE [dbo].[Route] 
    ADD [EstimatedDeparture] AS 
    CONVERT (TIME (7), DATEADD(SECOND, 
    (((DATEPART(HOUR, [EstimatedArrival]) * 3600) 
    + (DATEPART(MINUTE, [EstimatedArrival]) * 60) 
    + DATEPART(SECOND, [EstimatedArrival])) 
    - [DriveSeconds] - [WaitSeconds]), ''), 114) 
    PERSISTED; 

它拋出

計算列的TIME計算列表'Route'中的'EstimatedDeparture'不能保持,因爲該列是非確定性的。

爲什麼?我認爲CONVERT(TIME (7) ...)應保證列類型爲TIME

請注意,如果我在查詢中使用此轉換表達式,它工作正常。 我該如何解決這個問題?

+0

@HABO事實證明,有*是*在有一個字符串格式(注意'「」'),和114不似乎與這個問題有關。 –

回答

2

這個空字符串應該代表什麼?

- [DriveSeconds] - [WaitSeconds]), ''), 114) 
-----------------------------------^^ 

這可能會告訴SQL Server,你將會把它解釋爲字符串的一部分。雖然我與哈勃同意,你不需要114風格要麼,我是能夠使使用以下,仍然採用了不必要的風格號這項工作:

- [DriveSeconds] - [WaitSeconds]), 0), 114) 

這是否仍保留適當的計算,我不確定,因爲我不知道意圖是什麼,但是避免隱式轉換爲字符串應該避免這個問題。

+0

根據[MSDN](http://msdn.microsoft.com/en-us/library/ms186819.aspx),這是'DATEADD'的'date'參數。將其設置爲0可以解決問題。輝煌! – metric

+0

另外我同意114是不需要的。 – metric

1

您可以矯正和簡化這樣說:

ALTER TABLE [dbo].[Route] 
ADD [EstimatedDeparture] AS 
CONVERT (TIME (7), DATEADD(SECOND, - [DriveSeconds] - [WaitSeconds], [EstimatedArrival])) 
PERSISTED; 
相關問題