繁体   English   中英

将列的数据类型从nvarchar(50)更改为datetime

[英]Change datatype of a column from nvarchar(50) to datetime

我正在尝试将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,级别16,状态1,第7行从字符串转换日期和/或时间时转换失败。

我尝试过的另一个命令:

update TableA set Scan_Start2 = convert(datetime, STUFF(STUFF(STUFF(Scan_Start, 9, 0, ' '), 12, 0, ':'), 15, 0, ':')); 

此命令引发以下错误

消息242,级别16,状态3,行16将nvarchar数据类型转换为datetime数据类型导致值超出范围。 该语句已终止。

任何人都可以帮助我。

如果您的字符串始终具有相同的长度和格式,则可以应用以下逻辑,以防万一任何字符串的格式不符合预期,您会看到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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM