如何将分钟添加到时间数据类型?


10

我有一个存储过程,该过程将两个记录插入到一​​个表中,记录之间的区别是第二个记录的时间列在第一个记录@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和添加分钟的正确方法是什么@EndTime
请注意,我正在使用time数据类型。

更新
正确答案应包含以下信息:

  • 如何将分钟添加到time数据类型。
  • 所提出的解决方案不会导致精度损失。
  • 如果分钟数太大而无法容纳time变量,则要注意的问题或担忧,否则有将time变量翻转的风险。如果没有问题,请声明。

5
我看不到您对问题的编辑如何进一步澄清当前的问题。
swasheck 2013年

@swasheck我明确声明了我要寻找的三件事。我也对我不想要的东西设置了界限。
20:42修改

Answers:


36

您不能对新类型使用惰性速写算法。尝试:

DATEADD(MINUTE, @MinutesToAdd, @StartTime)

请注意,即使您已保护您@MinutesToAdd免受溢出,也并未保护结果免受溢出。这不会产生错误,但是,可能不是您所期望的结果。

DECLARE @StartTime TIME(0) = '23:59';
DECLARE @MinutesToAdd INT = 20;

SELECT DATEADD(MINUTE, @MinutesToAdd, @StartTime);

结果:

00:19:00

我认为这必须进行某种类型的内部转换,因为您无法通过说出以下结果:

DECLARE @StartTime TIME(0) = '24:19';

结果:

消息241,级别16,状态1,行1
从字符串转换日期和/或时间时转换失败。

您需要考虑如何处理导致一次@EndTime或两次@StartTime@EndTime在第二天进行的计算。

另外-为了解决“理想答案”中的另一个新要求-不会损失精度。根据文档,返回类型DATEADD与输入相同:

返回数据类型是date参数的数据类型,字符串文字除外。

因此,TIME进,TIME出。


1
+1 @Aaron另外,您也可以将StartTime和TimeToAdd转换为日期时间,然后添加。当分钟> 59时,转换TimeToAdd将非常混乱。DATEADD是最佳解决方案。
brian 2013年

如果添加的DATEADD返回类型与date参数相同,那么我将接受。“是否需要防止溢出?” 行是不需要的。滚存问题将由数据源和数据目的地处理。
Trisped

3
@Trisped可以肯定的是,如果您添加到您的问题中,您认为DATEADD不适当,因为您认为它只能返回DATETIME,这可能会导致问题。否则,这似乎与您的问题或未来的读者无关
亚伦·伯特兰

“请注意我正在使用时间数据类型”怎么不暗示相关性?另外,为什么您将我的问题更改为不停地使用行而不是记录?
Trisped

1
@Trisped编辑使用了更好的术语,请查看编辑时的常见问题解答-让我们不再来回了,否则我将锁定这个问题。亚伦(Aaron)正确的是,我们需要向他人说明一切,您有答案。如果您认为有帮助,请考虑按照他的建议编辑问题:如果您愿意,Aaron愿意提供您想要的信息。
杰克说,请尝试topanswers.xyz 2013年

0

只需使用dateadd函数将您的分钟数与“ 0:00”相加即可。然后回想一下时间。

选择演员表(dateadd(minute,84,'0:00')作为时间)

在这里,84是我想用“时间”类型表示的整数分钟。

我将其添加到“ 0:00”,然后删除日期部分,将其强制转换为时间类型。无需自定义编码。

(无列名)

01:24:00.0000000

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.