Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将日期从字符串转换为新的日期字段_Sql Server_Date_Type Conversion - Fatal编程技术网

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

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

我有一个从Excel导入SQL Server 2012的表,它拒绝作为日期字段导入。它以VarChar的形式出现,看起来像2017年3月15日。所以我所做的是在表中创建一个新的日期字段,现在我只想用文本的日期版本填充该字段

为此,我编写了以下小更新代码:

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