2017-09-14 73 views
1

我有一個varchar列,其值爲「Aug 07 2017, 04:14 AM,EDT」。在SQL Server中將varchar轉換爲日期

我需要將其轉換爲日期列,以使其可能取最大值date

我嘗試這樣做:

select CONVERT(datetime, @dateField, 108) 
from table 

但我收到以下錯誤:

Conversion failed when converting date and/or time from character string.

+2

刪除逗號和「EDT」,它應該工作。當然,最好的選擇是*總是*在日期(時間)數據類型中存儲日期! – HoneyBadger

回答

2

你可以只使用left()convert()

select convert(date, left('Aug 07 2017, 04:14 AM,EDT', 11)) 

如果你想有一個日期時間然後分別轉換的日期和時間,然後:

select (convert(datetime, 
       left('Aug 07 2017, 04:14 AM,EDT', 11) 
       ) + 
     convert(datetime, 
       convert(time, 
         substring('Aug 07 2017, 04:14 AM,EDT', 14, 8) 
         ) 
       ) 
     ) 

注:這是不是抽空帶進去。

+0

我想,你的第二個查詢是錯誤的。括號太多或太少(在我看來,第一個不需要)和'convert(datetime,convert(time,substring('Aug 07 2017,04:14 AM,EDT',14,18))'should替換爲'convert(datetime,convert(time,substring('Aug 07 2017,04:14 AM,EDT',14,8)))',因爲使用長度爲18的子字符串還包括',EDT',這會導致問題 – Rokuto

+0

@Rokuto ...好抓。 –

+0

在'SUBSTRING'函數中將'18'更改爲'8'並且會很棒;] – Rokuto

0

這裏是一個解決方案:

select CONVERT(datetime, REPLACE(LEFT(@dateField, LEN(@dateField) - 3),',','') ,108) 
0

更好的解決方案的日期時間

DECLARE @dateField AS NVARCHAR(50) = 'Aug 07 2017, 04:14,EDT' 
-- Get index of last comma 
DECLARE @validDateField AS NVARCHAR(20) = REPLACE(LEFT(@dateField, LEN(@dateField)- CHARINDEX(',', reverse(@dateField))), ',','') 
SELECT CONVERT(DATETIME, @validDateField, 108) 
相關問題