我正在尝试将nvarchar(50)格式的列(Scan_Start)转换为datetime格式。该列包含类似'20190410183452'的值,基本上是yyyymmddhhmmss。我已经尝试了以下命令,但是它不起作用。
UPDATE TableA SET Scan_Start2= cast((SUBSTRING(Scan_Start,1,4) + '-' + SUBSTRING(Scan_Start,5,2) + '-' +
SUBSTRING(Scan_Start,7,2) + ' ' +
SUBSTRING(Scan_Start,9,2) + ':' +
SUBSTRING(Scan_Start,11,2) + ':' +
SUBSTRING(Scan_Start,13,2)) AS DATETIME)
from GSSC_July_Completed_AP_Test_Date;
此命令将引发以下错误。
第241级国家/地区7行第241条消息 从字符串转换日期和/或时间时转换失败。
我尝试过的另一个命令:
update TableA set Scan_Start2 = convert(datetime, STUFF(STUFF(STUFF(Scan_Start, 9, 0, ' '), 12, 0, ':'), 15, 0, ':'));
此命令将引发以下错误
Msg 242,第16级,状态3,第16行 从nvarchar数据类型到datetime数据类型的转换导致值超出范围。 该声明已终止。
任何人都可以帮助我。
答案 0 :(得分:1)
如果您的字符串始终具有相同的长度和格式,则可以应用以下逻辑,以防万一任何字符串的格式不符合预期,您将看到NULL
:
Declare @String varchar (20) = '20190410183452';
select TRY_CONVERT(datetime, LEFT(@String, 8) ) as ConvertedDate,
(SUBSTRING(@String,9, 2)) as [Hours],
(SUBSTRING(@String,11, 2)) as [Minutes],
(SUBSTRING(@String,13, 2)) as [Seconds],
DATEADD(SECOND,
CAST( (SUBSTRING(@String,13, 2)) AS INT),
DATEADD(MINUTE,
CAST ((SUBSTRING(@String,11, 2)) AS INT),
DATEADD(HOUR,
CAST( (SUBSTRING(@String,9, 2)) AS INT),
TRY_CONVERT(datetime, LEFT(@String, 8) )
)
)
) as CovertedDatetime