Sql server 将日期从字符串转换为新的日期字段
我有一个从Excel导入SQL Server 2012的表,它拒绝作为日期字段导入。它以VarChar的形式出现,看起来像2017年3月15日。所以我所做的是在表中创建一个新的日期字段,现在我只想用文本的日期版本填充该字段 为此,我编写了以下小更新代码:Sql server 将日期从字符串转换为新的日期字段,sql-server,date,type-conversion,Sql Server,Date,Type Conversion,我有一个从Excel导入SQL Server 2012的表,它拒绝作为日期字段导入。它以VarChar的形式出现,看起来像2017年3月15日。所以我所做的是在表中创建一个新的日期字段,现在我只想用文本的日期版本填充该字段 为此,我编写了以下小更新代码: update [dbo].[Sheet5$] set TDate = CAST(SUBSTRING([Date], 7, 4) + '/' + SUBSTRING([Date], 1, 2) + '/' + SUBSTRING([Da
update [dbo].[Sheet5$]
set TDate = CAST(SUBSTRING([Date], 7, 4) + '/' + SUBSTRING([Date], 1, 2) + '/'
+ SUBSTRING([Date], 4, 2) AS DATETIME)
这给了我一个错误:
nvarchar数据类型转换为datetime数据类型导致值超出范围
有谁能告诉我我做错了什么,以及如何修复它,以便我将这些日期输入到日期字段中吗?您的表中某处有一些无效数据。如果您使用的是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为NULL的行,找出这些行无效的原因并修复数据。如果2012+使用try\u convert与format配合使用。如果您有虚假或格式错误的数据,它不会抛出错误
范例
返回
datefromparts对于您来说可能是一个更安全的函数,可以更明确地说明哪些部分是年、月、日等。这可能是区域设置的差异,也可能是该列中存在无效日期的值。您可以使用-SELECT[Date]FROM[dbo].[Sheet5$]来识别有问题的行,其中TRY_CONVERTDATE[Date],101为空-在这里,您不会因为错误的输入而得到错误,在本例中,您可以使用CONVERT而不是CAST来指定样式101,以便CONVERT函数知道为此预期的日期格式为MM/dd/yyyyThanks。虽然约翰的答案也很有效,但我给了这个复选标记,因为它指出存在不良数据。事实上,有人输入了2017年6月31日,没有6月31日。有一个6月31日:。谁没听说过著名的俄罗斯电视奇幻音乐剧;请记住,如果值无法转换,这将在没有警告的情况下插入空值。最好您先使用select*where try_convert查找无法转换为日期的数据。。。是空的。@Christian4145显然他们在表中已经有空值,正在尝试更新它。可以很容易地在此之前或之后检查以修复源数据。工作完美,谢谢@约翰尼很乐意帮忙
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