SQL 服务器区分看似相等的日期字符串并抛出转换错误

SQL Server discriminates between seemingly equal date strings and throws conversion error

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

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

Conversion failed when converting date and/or time from character string.

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

修剪字符串无效。我也试过手动改写源文件中的日期字符串,结果还是一样。

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

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

returns:

Conversion failed when converting date and/or time from character string.

select DATE_COLUMN 
from dbo.table

returns:2018 年 5 月 20 日

select CONVERT(date,'20.5.2018', 104) 

returns: '2018-5-20'

我希望 SQL 服务器以相同的方式处理每个转换。虽然有一个解决方法(将字符串拆分为日期部分并将它们组合成日期),但我不明白为什么转换首先失败。任何帮助表示赞赏。

使用try_convert()求问题值:

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

您的问题不可重现。以下测试:

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;

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

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

由于我曾尝试修剪值但没有奏效,因此我的结论是 'invisible' 字符都得到了处理。老实说,我从来没有想过可以将回车符 return 导入到列中。

由于我无法更改源文件,而且我不确定如何为导入设置动态分隔符,我通过删除 {CR} 解决了这个问题:

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