2012-09-04 52 views
1

我運行SQL Server標準2008 R2的Windows Server 2008 R2標準(SP1)部分,並轉換成datetime在T-SQL

的64位版本,我已經導入一個日誌文件作爲平面文件源。名爲big的表中名爲col2的導入列之一包含這樣的值:16/Mar/2007:11:30:17varchar(50)

我想將該列(col2)轉換爲datetime數據類型。

我正在嘗試的一種方法是提取日期字符串的每個部分,然後重新組合並轉換它們。

我遇到的問題是,每列都有不同的寬度,因爲日誌文件不能整齊地分隔,使得使用類似CHARINDEX的東西返回一個數字或有時爲NULL。

我一直在試圖設置使用正則表達式使用CLR集成,但無法讓它工作(我不能在Visual Studio中創建一個C#項目,沒有選項),Master Data Services贏得了'因爲SQL Server 2008 R2 Standard不支持它。

什麼是我最好的方法來做到這一點?使用CASESUBSTRINGCHARINDEX

回答

1
select convert(datetime, 
     SUBSTRING('16/Mar/2007:11:30:17', 0, CHARINDEX(':', '16/Mar/2007:11:30:17')) + ' ' + 
     SUBSTRING('16/Mar/2007:11:30:17', CHARINDEX(':', '16/Mar/2007:11:30:17') + 1, 8) , 1) 
3

試試這個

DECLARE @d varchar(50) = '16/Mar/2007:11:30:17' 

SELECT CAST(STUFF(@d,CHARINDEX(':',@d),1,' ') AS DATETIME) 
0

試試這個>

select convert(datetime,STUFF(big,CHARINDEX(':',big),1,' '),101) from yourtable 

舉例:檢查這裏DATATIME串format.If它同樣會工作

DECLARE @d varchar(50) = '16/Mar/2007:11:30:17' 
select convert(datetime,STUFF(@d,CHARINDEX(':',@d),1,' '),101) 
+0

嗯,我想這一個,剪裁它爲:'選擇轉換:從big'(日期時間,STUFF(COL2,CHARINDEX( '',COL2),1,」「),101) ,和得到:「msg 241,級別16,狀態1,行1 轉換日期和/或時間從字符串轉換失敗。」 –

2

雖然我喜歡EricZ的想法,但是,這是我的解決方案

DECLARE @d varchar(50) = '16/Mar/2007:11:30:17' 
SELECT CAST(LEFT(@d,PATINDEX('%:%',@d) - 1) + ' ' + SUBSTRING(@d,PATINDEX('%:%',@d) + 1,LEN(@d)) AS DATETIME)