我在我们的数据库中插入数据时发现了一个问题。我的插入语句正在检查 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
Run Code Online (Sandbox Code Playgroud)
它打印:
如果插入数据,比较 (=) 运算符的执行方式与隐式强制转换的执行方式不同。cast/convert 运算符实际上丢弃了偏移量!疯狂。
为什么比较运算符的工作方式与 INSERT 期间发生的隐式转换不同?
sql-server ×1