如何在SQL Server中添加时间数据类型的列

3

我有一个在SQL Server 2012中的表,其中有一个名为Duration的列,其数据类型为Time。我想要基于日期之间的差异来更新这个列,通过将差异添加到此Duration列中。如何在存储过程(SP)中实现这个操作。

ID    StartDate               EndDate                 Duration
1     2017-02-27 09:10:35     2017-02-27 09:25:35      00:15
2     2017-02-27 09:26:35   2017-02-27 09:36:35        00:25

持续时间始终小于24小时。


你没有明确说明的关键点是,你似乎希望将持续时间作为持续时间值的一部分来汇总之前的ID。你需要澄清这一点。 - UnhandledExcepSean
我想以每行的总和形式获取日期差异,单位为hh:mm。 - SajidBp
被采纳的答案并没有将持续时间总结起来,所以我不明白为什么你会接受它。 - UnhandledExcepSean
4个回答

2

其中一种方法是:

update t
    set duration = cast(dateadd(ms, datediff(ms, startdate, enddate), 0) as time);

嗨,戈登。为了提高自己的能力,我希望你能告诉我我的算术方法有什么问题?这里返回的是有效答案,但我收到了一个负分 - 所以我觉得肯定有什么问题。你能给出任何解释吗? - 3BK
实际上,在检查您的响应时,我收到了一个错误...不允许从数据类型int转换为time。(SQLSTATE=22018)(529)(严重性=16)(MsgState=2)...想告诉你一声,希望我没有越界... - 3BK
摆脱 cast(0 as time) 并将其改为 0 可以解决该错误。 - UnhandledExcepSean

1
这很简单,只需使用简单的算术运算:
DECLARE @TABLE TABLE (Start DATETIME, Finish DATETIME, Duration TIME);

INSERT INTO @TABLE VALUES ('02/28/2017 08:00','02/28/2017 08:30','');
INSERT INTO @TABLE VALUES ('02/28/2017 09:00','02/28/2017 09:40','');
INSERT INTO @TABLE VALUES ('02/28/2017 10:02','02/28/2017 11:53','');
INSERT INTO @TABLE VALUES ('02/28/2017 11:56','02/28/2017 12:45','');
INSERT INTO @TABLE VALUES ('02/28/2017 13:45','02/28/2017 23:59','');

UPDATE @TABLE
SET Duration = Finish - Start;

SELECT * FROM @TABLE;

返回:
Start                    Finish                 Duration
---------------------------------------------------------
28/02/2017 08:00:00      28/02/2017 08:30:00    00:30:00
28/02/2017 09:00:00      28/02/2017 09:40:00    00:40:00
28/02/2017 10:02:00      28/02/2017 11:53:00    01:51:00
28/02/2017 11:56:00      28/02/2017 12:45:00    00:49:00
28/02/2017 13:45:00      28/02/2017 23:59:00    10:14:00

这里唯一需要注意的是,它们需要在同一天。你明确说明了持续时间永远不会超过一天,所以应该没问题。
如果您想将结果添加到 Duration 的原始值中,则只需将其加上即可...
INSERT INTO @TABLE VALUES ('02/27/2017 08:00','02/28/2017 08:30','00:15');
INSERT INTO @TABLE VALUES ('02/28/2017 09:00','02/28/2017 09:40','00:14');
INSERT INTO @TABLE VALUES ('02/28/2017 10:02','02/28/2017 11:53','00:13');
INSERT INTO @TABLE VALUES ('02/28/2017 11:56','02/28/2017 12:45','02:16');
INSERT INTO @TABLE VALUES ('02/28/2017 13:45','02/28/2017 23:59','00:17');

UPDATE @TABLE
SET Duration = Duration + (Finish - Start);

返回:
Start                    Finish                 Duration
---------------------------------------------------------   
27/02/2017 08:00:00      28/02/2017 08:30:00    00:45:00
28/02/2017 09:00:00      28/02/2017 09:40:00    00:54:00
28/02/2017 10:02:00      28/02/2017 11:53:00    02:04:00
28/02/2017 11:56:00      28/02/2017 12:45:00    03:05:00
28/02/2017 13:45:00      28/02/2017 23:59:00    10:31:00

从被踩的情况来看,我可能误解了问题...? - 3BK

0

UPDATE [TABLE] SET [DURATION] = CONVERT(varchar(5),DATEADD(minute, DATEDIFF(MINUTE, StartDate, EndDate), 0), 114);

更新[TABLE] SET [DURATION] = CONVERT(varchar(5),DATEADD(minute, DATEDIFF(MINUTE, StartDate, EndDate), 0), 114);


声明 @t TIME 选择 @t = CONVERT(varchar(5),DATEADD(minute,DATEDIFF(MINUTE,'2017-02-22 17:03:40.757','2017-02-22 17:04:30.580'),0),114) 选择 @t - SajidBp

0

其他答案都没有尝试对持续时间进行求和,这正是您所期望的。

DECLARE @TABLE TABLE (ID INT, StartTime DATETIME, EndTime DATETIME, Duration TIME);

INSERT INTO @TABLE VALUES (1, '02/28/2017 01:00','02/28/2017 06:30','');
INSERT INTO @TABLE VALUES (2, '02/28/2017 09:00','02/28/2017 23:40','');
INSERT INTO @TABLE VALUES (3, '03/01/2017 10:02','03/01/2017 21:53','');

UPDATE t
SET Duration=
    CONVERT(TIME,
        (
            SELECT DATEADD(ms, SUM(DATEDIFF(ms, '00:00:00.000', EndTime - StartTime)), '00:00:00.000')
            FROM @TABLE it
            WHERE it.EndTime<= t.EndTime
        )
    )
FROM @TABLE t;

SELECT * FROM @TABLE;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接