2015-11-06 32 views
0

我有時間記錄存儲在我的SQL Server數據庫中作爲varchar,我試圖將其轉換爲時間。SQL Server:將varchar轉換爲具有無效記錄的時間(秒寫爲60)

例如,數據存儲爲12490811

我使用的語法:

cast(convert(time, stuff(stuff(stuff(CommentAddedTime, 3, 0, ':'), 6, 0, ':'), 9, 0, '.')) as time(0)) as 'CommentAddedTime' 

但也有存儲一些無效的記錄,其中秒超過59像11356000這並不讓我將varchar轉換爲時間。我想知道,如果我們可以使用Case語句或者像'00'這樣的東西,在看到寫入59的秒數時使用秒,否則使用相同的值。我相信語法應該是這樣的(我不知道該怎麼在「然後」語句寫):

select 
    case 
     when substring(stuff(stuff('11356000', 3, 0, ':'), 6, 0, ':'),7,10) > 5900 
      then .... 
      else 
      cast(convert(time, stuff(stuff(stuff(CommentAddedTime, 3, 0, ':'), 6, 0, ':'), 9, 0, '.')) as time(0)) 
    end as 'CommentAddedTime' 

請幫助我什麼,我們可以怎樣做呢?或者,如果有任何其他方法來解決這個問題,因爲我不能排除這些記錄。

在此先感謝!

+0

是什麼格式的字符串? –

回答

0

如何使用算術? SQL Server會自動將字符串轉換爲數字。然後,您可以將其轉換爲一次。對於毫秒計​​算:

select (left(CommentAddedTime, 2) * 60 * 60 * 1000 + 
     substring(CommentAddedTime, 3, 2) * 60 * 1000 + 
     substring(CommentAddedTime, 5, 2) * 1000 + 
     substring(CommentAddedTime, 7, 2) * 10 
     ) 

要將此轉換爲時間:

select dateadd(ms, 
       (left(CommentAddedTime, 2) * 60 * 60 * 1000 + 
       substring(CommentAddedTime, 3, 2) * 60 * 1000 + 
       substring(CommentAddedTime, 5, 2) * 1000 + 
       substring(CommentAddedTime, 7, 2) * 10 
       ), 
       cast(cast(0 as datetime) as time) 
      ) 

(SQL Server不允許cast(0 as time)但它允許雙投。)

+0

數據保存爲15133207(varchar),我想將其轉換爲(時間)15:13:32並丟棄最後兩位數字。我使用語法:cast(時間,東西(東西(stuff(CommentAddedTime,3,0,':'),6,0,':'),9,0,'。'))as time(0 ))作爲'CommentAddedTime'但有一些無效的記錄,如:11356000哪些不轉換成時間,有沒有什麼辦法可以解決這個問題?可能會使用00秒並顯示結果爲:11:35:00? –

+0

@GeetanjaliSachdeva。 。 。我不明白你的回答有什麼問題嗎?將字符串解析爲幾小時,幾分鐘和幾秒鐘,然後將這些字符串轉換爲毫秒(如果您願意的話可以秒),然後構建'time'變量。 –

+0

我想將nvarchar轉換爲時間hh:mm:ss,但存儲的數據無效。例如:如果數據(nvarchar)是11356000,結果應該是:11:35:00(不包括毫秒和顯示秒數爲00)我們該怎麼做? –