SQL Server区分看似相等的日期字符串,并引发转换错误

时间:2019-02-18 18:44:37

标签: sql sql-server type-conversion date-conversion

从.csv导入dd.(m)m.yyyy格式的日期字符串后,我似乎无法将它们转换为日期。

使用CONVERT (date, DATE_COLUMN, 104)会导致错误:

  

从字符串转换日期和/或时间时转换失败。

但是,如果我尝试转换从列选择输出(CONVERT (date, '20.5.2018', 104))复制的值,则该代码对于列中的每个单个值都可以正常工作。

修剪字符串无效。我还尝试过手动重写源文件中的日期字符串,但结果是相同的。

总结(使用1个示例值):

select CONVERT(date, DATE_COLUMN, 104)  
from dbo.table

返回:

  

从字符串转换日期和/或时间时转换失败。

select DATE_COLUMN 
from dbo.table

返回:20.5.2018

select CONVERT(date,'20.5.2018', 104) 

返回:'2018-5-20'

我希望SQL Server以相同的方式对待每个转换。尽管有一种解决方法(将字符串拆分为日期部分并将其组合为日期),但我不明白为什么转换首先会失败。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:0)

使用try_convert()查找问题值:

select DATE_COLUMN 
from dbo.table
where try_convert(date, DATE_COLUMN, 104) is null and
      DATE_COLUMN is not null;

答案 1 :(得分:0)

您的问题不可复制。以下测试:

CREATE TABLE dt (DATE_COLUMN varchar(10));

INSERT INTO dt VALUES ('20.5.2018');

SELECT CONVERT(date, DATE_COLUMN, 104)  
FROM dt;

DROP TABLE dt;

返回2018-05-20并且不会导致任何错误。

答案 2 :(得分:0)

问题是由回车符与字符串一起导入到每一行引起的。平面文件连接的行定界符设置为{LF},但是某些源平面文件使用了{CR} {LF}定界符,因此,{CR}字符已导入到列中。

由于我尝试过修剪值,但没有效果,所以我的结论是,“看不见”的字符都得到了照顾。老实说,我从未想过可以将回车符导入到列中。

由于我无法更改源文件,并且不确定如何为导入设置动态定界符,因此我通过以下方式删除了{CR}来解决了这个问题:

REPLACE(DATE_COLUMN,char(13),'')