Tri*_*ped 12 sql-server-2008 sql-server
我有一个将两条记录插入到表中的存储过程,记录之间的区别在于第二条记录的时间列在第一条@MinToAdd
之后:
CREATE PROCEDURE CreateEntry
/*Other columns*/
@StartTime time(2),
@EndTime time(2),
@MinutesToAdd smallint
AS
BEGIN
SET NOCOUNT ON;
SET @MinutesToAdd = @MinutesToAdd % 1440; --Prevent overflow if needed?
IF (@MinutesToAdd > 0)
BEGIN
INSERT INTO ClientNotification (/*Other columns*/ startTime, endTime)
OUTPUT inserted.id
VALUES
(/*Other columns*/ @StartTime, @EndTime),
(/*Other columns*/ @StartTime + @MinutesToAdd, @EndTime + @MinutesToAdd);
END
ELSE
BEGIN
/*Whatever ELSE does.*/
END
END
Run Code Online (Sandbox Code Playgroud)
将@MinutesToAdd
分钟添加到@StartTime
和的正确方法是什么@EndTime
?
请注意我使用的是time
数据类型。
更新:
正确答案应包含以下信息:
time
数据类型。time
变量或有滚动time
变量的风险,则需要注意的问题或顾虑。如果没有问题,请说明。Aar*_*and 37
您不能对新类型使用惰性速记算术。尝试:
DATEADD(MINUTE, @MinutesToAdd, @StartTime)
Run Code Online (Sandbox Code Playgroud)
请注意,即使您已防止@MinutesToAdd
溢出,您也没有防止结果溢出。这不会产生错误,但是,可能不是您期望的结果。
DECLARE @StartTime TIME(0) = '23:59';
DECLARE @MinutesToAdd INT = 20;
SELECT DATEADD(MINUTE, @MinutesToAdd, @StartTime);
Run Code Online (Sandbox Code Playgroud)
结果:
00:19:00
Run Code Online (Sandbox Code Playgroud)
我认为这必须经过某种类型的内部转换,因为您无法通过以下方式获得该结果:
DECLARE @StartTime TIME(0) = '24:19';
Run Code Online (Sandbox Code Playgroud)
结果:
从字符串转换日期和/或时间时,消息 241,级别 16,状态 1,第 1 行转换失败。
您需要考虑如何处理导致其中一个@EndTime
或两个@StartTime
并且@EndTime
在第二天进行的计算。
此外 - 为了解决您的“理想答案”中的另一个新要求 - 没有精度损失。根据文档,返回类型DATEADD
与输入相同:
返回数据类型是日期参数的数据类型,字符串文字除外。
因此,TIME
进,TIME
出。