declare @v1 datetime = getdate();
declare @v2 int = 2;
select @v1 + @v2;
---------------------------
2013-01-06 08:16:20.620
但是
declare @v1 datetime = getdate();
declare @v2 char(1) = '2';
select @v1 + @v2;
--------------------------
Msg 241,Level 16,State 1,Line 5
从字符串转换日期和/或时间时转换失败。
给出错误。但int @v2
和char @v2
都有相同的值?
答案 0 :(得分:3)
当组合两个不同类型的运算符时,您将进行隐式类型转换。转换的内容由Data Type Precedence规则控制。
char
和int
的优先级低于日期时间,因此您的查询等效于:
select @v1 + cast(@v2 as datetime);
将int值2
投射到datetime
的工作正常,并为您提供1900-01-03 00:00:00.000
将char值2
转换为日期时间不起作用,因为字符串2
无法解释为有效的日期时间值。
答案 1 :(得分:0)
当char被转换为datetime时...它通常是假的...因为有些字符无法转换为datetime ..而且可能溢出..就像'2','a'等...
你需要一个像'2013-01-04'这样的char值......它们可以正确转换..