在我们的数据库中插入数据时,我发现了一个问题。我的插入语句正在检查 WHERE 子句中是否存在数据,以防止插入重复数据。没有检测到,并且发生了 INSERT。但是,唯一约束拒绝了数据,因为它已经存在于数据库中。
问题是要插入的数据是 DATETIMEOFFSET(2),而要插入的数据库字段是 DATETIME。
为了表明你想要我在说什么,运行以下命令:
DECLARE @dt DATETIME = '2014-07-07 09:49:33.000';
DECLARE @dto DATETIMEOFFSET(2) = '2014-07-07 09:49:33.00 +07:00';
PRINT CASE WHEN @dt = @dto THEN 'Equals matches'
ELSE 'Equals does not match'
END
PRINT CASE WHEN @dt = CAST(@dto AS DATETIME) THEN 'Cast matches'
ELSE 'Cast does not match'
END
它打印:
- 等于不匹配
- 演员匹配
如果插入数据,比较 (=) 运算符的执行方式与隐式强制转换不同。cast/convert 运算符实际上丢弃了偏移量!疯狂。
为什么比较运算符与 INSERT 期间发生的隐式转换的工作方式不同?