2010-02-26 113 views
0

我有一個SQL Server函數,它將nvarchar日期設置轉換爲datetime值。將nvarchar日期設置轉換爲日期時間

天持續時間格式是>天<>小時<:>分鐘<,例如1.2:00 1天,兩小時。

無法更改日期設置的格式,我們可以確保所有數據格式正確並存在。

給函數一個開始時間和日期設置它應該返回結束時間。

例如:2010-01-02 13:30 ==> 2010-01-03 2:00

我使用CHARINDEX,子組合和變換方法來計算值,其中 是一種緩慢和尷尬。有沒有其他方法可以將這一天持續時間設置直接轉換爲日期時間值?

回答

2

不是我所看到的。我最終會得到類似於你的一些SQL,使用charindex等。不幸的是,這取決於持續時間的存儲格式。我知道你不能改變它,但如果它的格式不同,那麼它會要容易得多 - 我通常會這樣做的方式就是將持續時間合理化爲基本單位(如分鐘)。 (1 * 24 * 60)+(2 * 60)= 1560,而不是存儲1.2:00 1天和2小時。然後這可以用在原始日期的直接DATEADD上僅限日期部分)。

你所擁有的格式,我能想到的所有方法都涉及使用CHARINDEX等

+0

啊...我知道,但不幸的是格式是某種遺產,因爲它是在其他一些系統中使用,我不能改變它。 – Drejc 2010-02-26 09:25:21

+0

@Drejc - 我不認爲老實說,還有別的方法。這絕對是性能下降的原因嗎?我建議的另一件事是不要在SQL Server中進行計算,但按照原樣返回兩個字段,並讓調用代碼執行,以便在字符串操作中執行得更好。 – AdaTheDev 2010-02-26 09:27:56

+0

實際上,這是按照您描述的方式完成的,除了一種情況,必須在SQL端執行計算。 這不會導致任何緩慢的反應或類似的問題,但它只是一個醜陋的解決方案。 – Drejc 2010-02-26 10:02:16

1

一個替代辦法是建立一個與計算的字符串。然後可以用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) 
+0

呵呵......這當然是一種方法,但它非常難以理解,下一個人只會說FTW;) – Drejc 2010-02-26 09:48:00

+1

你問了一個沒有charindex tho的解決方案;) – Andomar 2010-02-26 11:47:49

+0

+1,太棒了!這顯示了爲什麼CHARINDEX很重要!你可能會讓你的charindex版本變得更加簡單,用日期的LEFT()和右邊的()分鐘 – 2010-02-26 14:40:52