这两种日期格式都可以很好地转换。默认的convert 算法在灵活处理给出的内容方面做得相当不错。还有一个null 字符串,正如我之前评论的, will always convert to anulldatetime value: per the standard, any expression that involvingnullyieldsnull`。
我怀疑您遇到了数据问题。最有可能的垃圾字符,如嵌入式 CR、LF 或 CR+LF(换行符)。 HT(制表符)字符似乎也破坏了convert()。您(或您的 DBA)可能需要进行数据清理以消除垃圾字符。或者你需要解决这个问题并编写一个丑陋的表达式来修复运行时的坏数据。
这样的查询应该可以识别问题数据:
select myCruftyDateTimeColumn,count(*)
from foo
where myCruftyDateTimeColumn is not null
-- m/d/yyyy hh:mm:ss AM format
and myCruftyDateTimeColumn not like '[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] [AP]M'
and myCruftyDateTimeColumn not like '[0-9][0-9]/[0-9]/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] [AP]M'
and myCruftyDateTimeColumn not like '[0-9]/[0-9]/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] [AP]M'
-- month d, yyyy alternatives, 2 digit days
and myCruftyDateTimeColumn not like 'January [0-9][0-9], [0-9][0-9][0-9][0-9]'
and myCruftyDateTimeColumn not like 'February [0-9][0-9], [0-9][0-9][0-9][0-9]'
and myCruftyDateTimeColumn not like 'March [0-9][0-9], [0-9][0-9][0-9][0-9]'
and ...
and myCruftyDateTimeColumn not like 'October [0-9][0-9], [0-9][0-9][0-9][0-9]'
and myCruftyDateTimeColumn not like 'November [0-9][0-9], [0-9][0-9][0-9][0-9]'
and myCruftyDateTimeColumn not like 'December [0-9][0-9], [0-9][0-9][0-9][0-9]'
-- month d, yyyy alternatives, 2 digit days
and myCruftyDateTimeColumn not like 'January [0-9], [0-9][0-9][0-9][0-9]'
and myCruftyDateTimeColumn not like 'February [0-9], [0-9][0-9][0-9][0-9]'
and myCruftyDateTimeColumn not like 'March [0-9], [0-9][0-9][0-9][0-9]'
and ...
and myCruftyDateTimeColumn not like 'October [0-9], [0-9][0-9][0-9][0-9]'
and myCruftyDateTimeColumn not like 'November [0-9], [0-9][0-9][0-9][0-9]'
and myCruftyDateTimeColumn not like 'December [0-9], [0-9][0-9][0-9][0-9]'
group by myCruftyDateTimeColumn
order by 1
您可能希望加载一个带有结果的临时表,然后从中加载
select *,convert(varbinary,myCruftyDateTimeColumn)
from #bad_data
准确识别假字符是什么。