2016-10-24 113 views
2

我正試圖圍繞我的團隊內部出現的問題進行討論。簡單查詢計算日後在計算中使用的日期之間的秒數。TSQL日期溢出問題

我們得到的問題/錯誤是:「datediff函數導致溢出,分隔兩個日期/時間實例的dateparts數量太大,請嘗試使用更精確的datepart使用datediff。

該圖顯示查詢並記錄其用於計算的信息。它正在工作的唯一原因是由於底部明確定義時間範圍的線。

當我刪除時間並且只保留日期時,我們得到溢出錯誤。

workingStart有一個數據類型datetime所以我能想到的唯一的事情是比較日期和日期時間字符串會導致溢出?

enter image description here

錯誤:

enter image description here

任何人都有一個正式的答案,爲什麼會出現這個錯誤?我唯一的猜測是dataType比較。

更新: 下面是查詢所有數據忽略sla dateDiff時。 enter image description here

+0

您確定'workingend'對每個記錄都有值嗎?也許你有一個'0'值,當你只有日期過濾時會顯示出來。 –

+0

@MarcB在不包括工作計算時添加了另一個數據截圖 – SBB

+1

datediff返回一個帶符號的32位整數作爲其結果,這意味着在幾秒內總共有68年的允許範圍。您應該運行單獨的查詢,查看是否有任何記錄的日期之間的差異> = 34,而不使用datediff。 –

回答

1

如果你仍然需要你的結果在秒。使用MINUTES然後放大。

cast(DateDiff(MINUTE,[workingStart],[WorkingEnd) as bigint)*60 

爲了生成秒溢出,你將需要超過68歲1個月19天,3小時14分7秒

Select DateAdd(SS,2147483647 ,'1900-01-01') -- 1968-01-20 03:14:07.000 
Select DateAdd(SS,2147483648 ,'1900-01-01') -- Overfow with just 1 more second 

我懷疑日期的差異更大有一個假的日期(開始或結束)

防止錯誤

Declare @YourTable table (StartDate Datetime,EndDate DateTime) 
Insert Into @YourTable values 
('2016-08-01 10:36:16','2016-09-01 11:15:16'), 
('1900-01-01 00:00:00','1968-01-20 04:14:07.000') -- will cause an error 


Select * 
     ,Seconds=DateDiff(SS,StartDate,EndDate) 
From @YourTable 
Where Abs(DateDiff(YY,StartDate,EndDate))<68 

如果您刪除了哪裏,您將看到錯誤

+0

謝謝,雖然我很樂意回答,但我真的只想知道這個問題的根源。 – SBB

+0

謝謝,約翰 - 你能確認'dateDiff'發生在我的'WHERE'子句過濾我的數據集之前嗎?有點困惑,爲什麼它使用的數據沒有在我的WHERE子句範圍內定義 – SBB

+0

@SBB查看更新的答案 –