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.
这是出乎意料的行为;我不知道为什么这不起作用。也许我忽略了什么?
提前致谢。
答案 0 :(得分:0)
问题在于数据。我的同事已经指出varchar中有一个我没有抓到的空间。空间需要删除,您需要考虑不同长度的值,如1/1/2017或11/11/2017。 这是他的解决方案:
select cast(ltrim(replace(replace(replace(allocationDate,char(9),' '),char(10),' '),char(13),' ')) as date)
删除此额外空格并成功插入该值。