小编Sim*_*hes的帖子

SQL Datetime / datetimeoffset(2) 比较和隐式转换

我在我们的数据库中插入数据时发现了一个问题。我的插入语句正在检查 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

6
推荐指数
1
解决办法
1万
查看次数

标签 统计

sql-server ×1