Answers:
那只是记录的行为。我认为没有人搞砸这些设置。
请参阅MSDN上的数据类型优先级。
当运算符组合两个不同数据类型的表达式时,数据类型优先级规则将指定优先级较低的数据类型转换为优先级较高的数据类型。
如注释中所述,空字符串在转换为日期时将转换为任何数字类型的0,并转换为1900-01-01 00:00:00.000。
编辑:我认为您的真正问题是您的设计是这样,所以您必须加入不同数据类型的字段。解决此问题的唯一方法是对join子句进行转换,这会影响查询性能。主要问题可能与架构设计有关
编辑:在评论中有很多讨论已转移到聊天中。不管看起来多么不合逻辑,将空字符串转换为其他数据类型都会产生任意值。
这段代码:
SELECT CONVERT(int, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
SELECT CONVERT(datetime, '')
产生以下输出:
0
0
1900-01-01
1900-01-01 00:00:00.000
然后,您可以期望此行为在其他先前的数据类型之间是一致的,并且期望将0转换为日期将产生相同的任意值,但事实并非如此。
SELECT CONVERT(date, 0)
产生
不允许从数据类型int到日期的显式转换。
因为这不是受支持的转换
而
SELECT CONVERT(datetime, 0)
退货
1900年1月1日00:00:00
是的,这很奇怪而且很随意,但是实际上是有据可查的并且可以解释。
CAST('' AS INT)
-> 0是否记录在某处?如果添加引用,那将是很好。