我有一个将两条记录插入表中的存储过程,记录之间的区别在于第二条记录的时间列在@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
@MinutesToAdd
将分钟添加到@StartTime
and的正确方法是什么@EndTime
?
请注意我使用的是time
数据类型。
更新:
正确答案应包含以下信息:
- 如何将分钟添加到
time
数据类型。 - 建议的解决方案不会导致精度损失。
- 如果分钟数太大而无法放入
time
变量中,或者有滚动time
变量的风险,需要注意的问题或顾虑。如果没有问题,请说明。
您不能对新类型使用惰性速记算术。尝试:
请注意,即使您保护了您
@MinutesToAdd
的溢出,您还没有保护结果免受溢出。这不会产生错误,但是,可能不是您期望的结果。结果:
我认为这必须经过某种类型的内部转换,因为您无法通过以下方式获得该结果:
结果:
您需要考虑如何处理导致其中之一
@EndTime
或两者@StartTime
并@EndTime
在第二天发生的计算。此外 - 为了解决您的“理想答案”中的另一个新要求 - 不会损失精度。根据文档,的返回类型
DATEADD
与输入相同:因此,
TIME
进,TIME
出。只需使用 dateadd 函数将您的分钟数以整数形式添加到“0:00”。然后时光倒流。
选择 cast(dateadd(minute,84,'0:00') 作为时间)
这里,84 是我想用“时间”类型表示的整数分钟。
我将它添加到“0:00”,然后删除日期组件,我将其转换为时间类型。无需自定义编码。
(无列名)
01:24:00.0000000