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

问题描述 投票:-2回答:3

从.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并将它们组合到日期中),但我不明白为什么转换失败的原因。任何帮助赞赏。

sql sql-server type-conversion date-conversion
3个回答
0
投票

使用try_convert()查找问题值:

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

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并且不会导致任何错误。


0
投票

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

由于我曾尝试修剪价值并且它不起作用,我的结论是,“隐形”字符都被照顾。说实话,我甚至从未想过可以将回车导入列。

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

REPLACE(DATE_COLUMN,char(13),'')
© www.soinside.com 2019 - 2024. All rights reserved.