在SQL Server中将varchar转换为日期

在SQL Server中将varchar转换为日期,sql,sql-server,datetime,Sql,Sql Server,Datetime,我有一个varchar列,其值类似于“2017年8月7日,美国东部夏令时凌晨4:14” 我需要将其转换为日期列,以便可以获取日期的最大值 我试过这个: select CONVERT(datetime, @dateField, 108) from table 但我得到了以下错误: 从字符串转换日期和/或时间时,转换失败 以下是一个解决方案: select CONVERT(datetime, REPLACE(LEFT(@dateField, LEN(@dateField) - 3),',','

我有一个
varchar
列,其值类似于“
2017年8月7日,美国东部夏令时凌晨4:14

我需要将其转换为日期列,以便可以获取
日期的最大值

我试过这个:

select CONVERT(datetime, @dateField, 108)  
from table
但我得到了以下错误:

从字符串转换日期和/或时间时,转换失败

以下是一个解决方案:

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

您只需使用
left()
convert()

如果需要日期时间,则分别转换日期和时间,然后:

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)
                        )
                )
       )

注意:这不考虑时区。

更好的日期时间解决方案

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)

删除逗号和“EDT”,它应该可以工作。当然,最好的选择是始终将日期存储在
日期(时间)
数据类型中!我认为,你的第二个问题是错误的。括号太多或太少(我认为不需要第一个)和
convert(datetime,convert(time,substring('Aug 07 2017,04:14 AM,EDT',14,18))
应替换为
convert(datetime,convert(time,substring('Aug 07 2017,04:14 AM,EDT',14,8)))
,因为获取长度为18的子字符串还包括引起问题的
,EDT
。@Rokuto…很好的捕获。在
子字符串
函数中将
18
更改为
8
,这将非常好;]@Rokuto…我认为我在实际测试代码时会犯更多错误,而在我不测试代码时会犯更多错误。
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)