2016-09-25 19 views
1

我有兩個DateTime列的表,start & endT-SQL:其中日期之間DATEDIFF選擇數據超過最大單元

我有具有像

select 
    ... 
    ... 
where 
    datediff(second, start, end) > xxx` 

我的線的存儲過程知道單位=秒,startend之間的最大差異是大約68年。

目前有一些虛假的遺留數據,其中startend之間的差異超過68年,並且當它遇到此存儲過程時,它會產生溢出錯誤。

我想要做的是編寫另一個腳本來選擇所有這些虛假數據,以便我們可以修補它們,我該怎麼做?我如何選擇一些記錄來修復產生錯誤本身的錯誤?

回答

3

首先,是否真的有必要做到這一點,以一秒的準確性。畢竟:

where datediff(minute, start, end) > xxx/60 

或:

where datediff(hour, start, end) > xxx/(60 * 60) 

但。 。 。如果不行,你可以試試:

where dateadd(hour, xxx/(60 * 60), 
       dateadd(second, xxx % (60 * 60), start) 
      ) > end 

編輯:

其實,你的問題是與日期,而不是xxx值。所以,這也應該工作:

where dateadd(second, xxx, start) > end 

這隻要xxx是一個整數,start是不是太大了(靠近任何類型的它是範圍的結束)工作。

+0

這是一個快速和很好的解決方案,但在我的情況下,是的...因爲存儲過程正在生產中,並且我的老年人不想在任何可能的時候更改任何生產代碼...(意思是如果我可以向他們解釋,使用第二個單元不可能做到這一點,我可以更改存儲過程,並且此解決方案將是一個可接受的解決方案) – shole

1

考慮CASE語句解析由左到右,你可以嘗試

Declare @YourTable table (id int,start datetime,[end] datetime) 
Insert Into @YourTable values 
(1,'1930-01-01','2016-09-25'), -- Greater than 2.14B seconds 
(2,'2016-09-24','2016-09-25') -- Something more reasonable 

Select * 
from @YourTable 
Where case when DateDiff(MINUTE,[start],[end]) > (2147483647/60) then 2147483647 else DateDiff(SECOND,[start],[end]) end > 100000 

返回(沒有例外

id start     end 
1 1930-01-01 00:00:00.000 2016-09-25 00:00:00.000 

編輯

我應該添加分鐘的陷阱允許4,080年vs 68.此外,默認值2147483647可能是一個更合理的數字,甚至0表示可疑數據。

相關問題