2012-09-27 60 views
0

我有以下日期格式92845,它們代表hhmmssT-SQL日期轉換

我想將其轉換爲SQL中的datetime

我可以用這樣的:

SELECT STUFF(STUFF('84936',3,0,'-'),6,0,'-') 

,但似乎T-SQL不順心的hour部分。

謝謝!

+1

什麼是一天,一個月,一年?此外,我沒有看到你在你提供的代碼中轉換爲'datetime'的位置。問題是什麼? SQL「不喜歡」什麼?是否有錯誤訊息? – cadrell0

+0

當你有興趣從字符串的右端(如這裏)而不是左端工作時,SQL Server的字符串操作函數是有限且重複的。你真的沒有選擇a)這個字符串到達​​的格式,和b)必須在T-SQL中重新格式化嗎? –

回答

5

好像你在下午編寫了代碼,現在它在早上不工作。如果你打算基於絕對定位,你需要確保字符串總是相同的長度。一種方法是用0填充字符串,然後取最右邊的6個字符。另外,您需要:而不是-用於H/M分離器。

SELECT STUFF(STUFF(RIGHT('0' + '84936', 6),3,0,':'),6,0,':'); 

結果:

08:49:36 

現在,它可以轉化爲一個日期時間:

SELECT CONVERT(DATETIME, STUFF(STUFF(RIGHT('0' + '84936', 6),3,0,':'),6,0,':')); 

結果:

1900-01-01 08:49:36.000 
+0

你的答案值得投票 – AnandPhadke

2

我不知道在哪裏92845目前存儲。如果它是一個變量,那麼像這樣將工作:

declare @t varchar(6) = '92845'; 
declare @fullt char(6) = RIGHT('000000' + @t,6) 

select DATEADD(second, 
    SUBSTRING(@fullt,1,2) * 3600 + 
    SUBSTRING(@fullt,3,2) * 60 + 
    SUBSTRING(@fullt,5,2),0) 

結果:

1900-01-01 09:28:45.000 

如果它在結果集的一列,那麼你可以做使用例如類似操作子查詢。

0

試試這個:

declare @t varchar(6) = '134524' 
select CASE WHEN len(@t)=5 then convert(datetime,convert(varchar(10),CAST(getdate() as date))+' '+'0'+LEFT(@t,1)+':'+SUBSTRING(@t,2,2)+':'+SUBSTRING(@t,4,2)) 
else convert(datetime,convert(varchar(10),CAST(getdate() as date))+' '+LEFT(@t,2)+':'+SUBSTRING(@t,3,2)+':'+SUBSTRING(@t,5,2)) end 
+0

你嘗試過一次'134524'嗎? –

+0

@ Aaron-這真的是一個很好的catch.I編輯腳本請檢查 – AnandPhadke

+0

哇,沒有進攻,但這是不必要的複雜。爲什麼你還會選擇日期?我們知道OP是2008+嗎? –