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),'')
从 .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),'')