将日期从字符串转换为新的日期字段

时间:2018-01-29 14:50:08

标签: sql-server date type-conversion

我有一个从Excel导入SQL Server 2012的表,拒绝导入作为日期字段。它作为一个看起来像“03/15/2017”的VarChar。所以我所做的就是在表格中创建一个新的Date字段,现在我只想用文本的Date版本填充该字段。

我写了这个小的更新代码来执行此操作:

update [dbo].[Sheet5$]
set TDate = CAST(SUBSTRING([Date], 7, 4) + '/' + SUBSTRING([Date], 1, 2) + '/' 
    + SUBSTRING([Date], 4, 2) AS DATETIME)

它给了我一个错误:

  

将nvarchar数据类型转换为日期时间数据类型会导致超出范围的值。

任何人都可以告诉我我做错了什么,以及如何修复它以便我可以将这些日期记录到日期字段中?

2 个答案:

答案 0 :(得分:1)

表格中的某些地方有一些无效数据。如果您在2012年或之后,可以使用TRY_CONVERT或TRY_PARSE而不是CAST。你也不需要那里的/字符。 ANSI支持的格式为YYYYMMDD。

update [dbo].[Sheet5$]
set TDate = TRY_CONVERT(SUBSTRING([Date], 7, 4) + SUBSTRING([Date], 1, 2) + SUBSTRING([Date], 4, 2) AS DATETIME)

然后你可以查看TDate IS NULL的行,找出这些行无效的原因并修复数据。

答案 1 :(得分:1)

如果2012+与try_convert()一起使用format()。如果您有伪造或格式错误的数据,它不会引发错误。

示例

Declare @YourTable Table ([Date] varchar(50))
Insert Into @YourTable Values 
 ('03/15/2017')
,('3/15/2017')
,('3/7/2017')
,('22/7/2017')

Select *
      ,AsDate   = try_convert(date,[Date]) 
      ,AsString = format(try_convert(date,[Date]),'MM/dd/yyyy')
 From @YourTable

<强>返回

Date        AsDate      AsString
03/15/2017  2017-03-15  03/15/2017
3/15/2017   2017-03-15  03/15/2017
3/7/2017    2017-03-07  03/07/2017
22/7/2017   NULL        NULL