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

时间:2019-08-28 05:02:25

标签: sql-server

我正在尝试将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数据类型的转换导致值超出范围。   该声明已终止。

任何人都可以帮助我。

1 个答案:

答案 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