一個替代辦法是建立一個與計算的字符串。然後可以用sp_executesql
運行生成的SQL,指定@enddate
作爲輸出參數:
declare @startdate datetime
declare @duration varchar(10)
declare @enddate datetime
set @startdate = '2010-01-02 13:30'
set @duration = '0.12:30'
declare @sql nvarchar(max)
set @sql = 'set @enddate = dateadd(mi,24*60*' +
replace(replace(@duration,'.','+60*'),':','+') + ', @startdate)'
exec sp_executesql @sql,
N'@startdate datetime, @enddate datetime out',
@startdate, @enddate out
這產生含有set @enddate = dateadd(mi,24*60*0+60*12+30, @startdate)
字符串,然後運行它。
我懷疑這是比普通charindex
方式更快:
declare @pos_dot int
declare @day int
declare @hour int
declare @minute int
select
@pos_dot = charindex('.',@duration),
@day = cast(left(@duration, @pos_dot-1) as int),
@hour = cast(left(right(@duration, 5), 2) as int),
@minute = cast(right(@duration, 2) as int),
@enddate = dateadd(mi, 24*60*@day + 60*@hour + @minute, @startdate)
啊...我知道,但不幸的是格式是某種遺產,因爲它是在其他一些系統中使用,我不能改變它。 – Drejc 2010-02-26 09:25:21
@Drejc - 我不認爲老實說,還有別的方法。這絕對是性能下降的原因嗎?我建議的另一件事是不要在SQL Server中進行計算,但按照原樣返回兩個字段,並讓調用代碼執行,以便在字符串操作中執行得更好。 – AdaTheDev 2010-02-26 09:27:56
實際上,這是按照您描述的方式完成的,除了一種情況,必須在SQL端執行計算。 這不會導致任何緩慢的反應或類似的問題,但它只是一個醜陋的解決方案。 – Drejc 2010-02-26 10:02:16