在其中一个存储过程中,我需要捕获实时事件的持续时间。保证永远不会超过 24 小时,因此结果列的数据类型选择为TIME(3)(映射到TimeSpan应用程序端)。计算过程如下:
update tbEvent set tWait= @dtEvent - dEvent - tEvent [where idEvent = @idEvent]
Run Code Online (Sandbox Code Playgroud)
此处dEvent和tEvent先前设置为dtEvent(原始事件@dtEvent的时刻)的日期和时间部分,并且是后续关闭事件的时刻。因此,我从 DATETIME 变量中减去 DATE 和 TIME 列值,并将结果填充到 TIME 列中。
[合理吗?] 预期行为: SQL 将每个表达式项隐式转换为 DATETIME,执行减法,然后通过简单地删除 DATE 部分将结果隐式转换为 TIME。 这一直有效! 嗯, - 到目前为止..
一个更新脚本突然在 SQL 2016 (13.0.1742.0) 上产生了一个错误:
System.Data.SqlClient.SqlException (0x80131904):
The data types datetime and date are incompatible in the subtract operator.
Error Number:402,State:1,Class:16
Run Code Online (Sandbox Code Playgroud)
但是相同的脚本在 2008 R2 (10.50.2500.0) 和 2019 (15.0.2080.9) 上运行良好! …