从.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以相同的方式处理每个转换。虽然有一种解决方法(将字符串拆分为dateparts并将它们组合到日期中),但我不明白为什么转换失败的原因。任何帮助赞赏。
使用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;
返回2018-05-20
并且不会导致任何错误。
问题是由回车导入到每一行以及字符串引起的。平面文件连接的行分隔符设置为{LF},但是某些源平面文件使用{CR} {LF}分隔符,因此,{CR}字符被导入到列中。
由于我曾尝试修剪价值并且它不起作用,我的结论是,“隐形”字符都被照顾。说实话,我甚至从未想过可以将回车导入列。
由于我无法更改源文件,并且我不确定如何为导入设置动态分隔符,因此我通过删除{CR}解决了问题:
REPLACE(DATE_COLUMN,char(13),'')