我有一个从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数据类型转换为日期时间数据类型会导致超出范围的值。
任何人都可以告诉我我做错了什么,以及如何修复它以便我可以将这些日期记录到日期字段中?
答案 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