2017-09-14 378 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)