将像'10 / 14/2017'这样的VARCHAR作为DATE数据类型插入到另一个表中

时间:2017-11-15 16:21:05

标签: sql-server-2008-r2

SQL Server 2008 R2

问题:我需要将看起来像'10 / 17/2017'或'3/3/2017'的VARCHAR值转换为DATE数据类型值,同时将它们插入到另一个表中。

场景 - 我有一个使用BULK INSERT从csv文件填充的中间表,要求中间表中所有列的数据类型为VARCHAR(与SQL Server 2012不同,我可以使用DATE数据类型) 。这就是为什么VARCHAR日期看起来像'3/3/2017'。

我在StackOverflow上读过许多类似的问题,但还没有找到解决方案。

我尝试过的一些显而易见的事情:

在INSERT操作之外进行测试时,这些示例正确地将VARCHAR正确转换为DATE:

SELECT CAST (importantDate AS DATE)
SELECT CAST(convert(datetime, '8/15/2007', 101) AS DATE)

结果:2007-08-15

但是,在INSERT / SELECT语句中使用时,这些转换会失败:

INSERT into finalTable 
( convertedDate )
SELECT CAST(convert(datetime, importantDate, 101) AS DATE)
FROM intermediateTable

INSERT into finalTable 
( convertedDate )
SELECT CAST(importantDate AS DATE)
FROM intermediateTable

产生的错误是: Conversion failed when converting date and/or time from character string.

这是出乎意料的行为;我不知道为什么这不起作用。也许我忽略了什么?

提前致谢。

1 个答案:

答案 0 :(得分:0)

问题在于数据。我的同事已经指出varchar中有一个我没有抓到的空间。空间需要删除,您需要考虑不同长度的值,如1/1/2017或11/11/2017。 这是他的解决方案:

select cast(ltrim(replace(replace(replace(allocationDate,char(9),' '),char(10),' '),char(13),' ')) as date)

删除此额外空格并成功插入该值。