无法将时间转换为mm:ss

时间:2018-12-02 13:16:44

标签: sql-server tsql

我有一个包含7列的表格:

Start_hour | Start_minute | Start_second | End_hour | End_minute | end_second | date

我的任务是总结当天开始时间和结束时间之间的差异。我的查询已经做到了。可悲的是,我需要输出仅以分钟:秒为单位。例如,时间差的总和为2小时26分钟52秒。

我需要我的输出像这样:

126:52

我的查询现在看起来像这样:

SELECT 
    RIGHT(CONVERT(CHAR(8), 
          DATEADD(SECOND, 
                  SUM(DATEDIFF(SECOND, 
                               Timefromparts(start_hour, start_minute, start_second, 0, 0), 
                               Timefromparts(end_hour, end_minute, end_second, 0, 0))
                 ), 0), 108), 5) 
FROM   
    opoznienia 
WHERE  
    YEAR(data) = YEAR(GETDATE()) 
    AND MONTH(data) = MONTH(GETDATE()) 
    AND DAY(data) = DAY(GETDATE()) 

样本数据:

Start_hour | Start_minute | Start_second | End_hour | End_minute | end_second | date
10  15  0   10   30   30   2018-11-27 14:40:53.680
10  15  0   10   30   30   2018-11-30 10:16:20.610
6   10  30  6    23   45   2018-12-02 01:00:27.243
8   10  0   8    53   45   2018-12-02 14:42:48.663
10  5   13  10   55   23   2018-12-02 14:53:03.560

上面查询的输出:

47:13 (without RIGHT command it would be 01:47:13)

所需的输出:

107:13

4 个答案:

答案 0 :(得分:0)

您需要计算秒数,然后根据需要对其进行格式化。根据秒数,您可以将分钟数除以60,剩下的就是秒数:

declare @NumberOfSeconds int = 7612
-- Returns 126:52
select concat(@NumberOfSeconds / 60, ':', FORMAT(@NumberOfSeconds % 60, 'D2'))

答案 1 :(得分:0)

这里是一种选择:

SELECT
    numSeconds,
    CASE WHEN numSeconds / 60 <= 100
         THEN RIGHT('00' + CONVERT(VARCHAR(20), numSeconds / 60), 2)
         ELSE CONVERT(VARCHAR(20), numSeconds / 60) END
         + ':' +
    CASE WHEN numSeconds / 60 <= 100
         THEN RIGHT('00' + CONVERT(VARCHAR(20), numSeconds % 60), 2)
         ELSE CONVERT(VARCHAR(20), numSeconds % 60) END AS output
FROM yourTable;

enter image description here

Demo

代码中的丑陋与您期望分钟和秒组成部分至少要两位数字有关。因此,如果分钟或秒恰好是个位数,我们必须在每个成分上填充零。

答案 2 :(得分:0)

尝试以下

CREATE TABLE T(
  StartHour INT,
  StartMinute INT,
  StartSecond INT,
  EndHour INT,
  EndMinute INT,
  EndSecond INT,
  [Date] DATE
);

INSERT INTO T VALUES
(10,  15,  0 ,  10,   30,   30, '2018-11-27'),   
(10,  15,  0 ,  10,   30,   30, '2018-11-30'),   
(6 ,  10,  30,  6 ,   23,   45, '2018-12-02'),   
(8 ,  10,  0 ,  8 ,   53,   45, '2018-12-02'),   
(10,  5 ,  13,  10,   55,   23, '2018-12-02');

SELECT *,

       CAST(  (DATEDIFF(Hour, StartTime, EndTime) * 60) +
              (DATEDIFF(Minute, StartTime, EndTime) % 60) AS VARCHAR
           ) + ':' +
       CAST(DATEDIFF(Second, StartTime, EndTime) % 60 AS VARCHAR)
FROM
(
  SELECT [Date],
         TIMEFROMPARTS(StartHour, StartMinute, StartSecond, 0, 0) StartTime,
         TIMEFROMPARTS(EndHour, EndMinute, EndSecond, 0, 0) EndTime
  FROM T
) TT

如果需要,您也可以SUM()GROUP BY [Date]

SELECT [Date],
       CAST(  SUM( (DATEDIFF(Hour, StartTime, EndTime) * 60) +
                   (DATEDIFF(Minute, StartTime, EndTime) % 60)
                 ) AS VARCHAR
           ) + ':' +
       CAST(SUM(DATEDIFF(Second, StartTime, EndTime) % 60) AS VARCHAR)
FROM
(
  SELECT [Date],
         TIMEFROMPARTS(StartHour, StartMinute, StartSecond, 0, 0) StartTime,
         TIMEFROMPARTS(EndHour, EndMinute, EndSecond, 0, 0) EndTime
  FROM T
) TT
GROUP BY [Date]

Demo


更新

似乎您正在寻找

SELECT [Date],
       CAST(SUM(DATEDIFF(Second, StartTime, EndTime)) / 60 AS VARCHAR) + ':' +
       CAST(SUM(DATEDIFF(Second, StartTime, EndTime)) % 60 AS VARCHAR) [MM:SS]
FROM
(
  SELECT [Date],
         TIMEFROMPARTS(StartHour, StartMinute, StartSecond, 0, 0) StartTime,
         TIMEFROMPARTS(EndHour, EndMinute, EndSecond, 0, 0) EndTime
  FROM T
) TT
GROUP BY [Date];

返回:

+---------------------+--------+
|        Date         | MM:SS  |
+---------------------+--------+
| 27/11/2018 00:00:00 | 15:30  |
| 30/11/2018 00:00:00 | 15:30  |
| 02/12/2018 00:00:00 | 107:10 |
+---------------------+--------+

Demo

答案 3 :(得分:0)

其他答案更好,但是要了解您尝试执行的操作中可能缺少的内容,可以查看使用DatePart的位置。 ->“

  

..(如果没有RIGHT命令,它将是01:47:13)

“这是您需要使用零件而不是整个零件的线索...

SELECT Cast
(
Datepart
(
hour,
DATEADD(second,sum(datediff(second, 
TIMEFROMPARTS ( Start_hour, Start_minute, Start_second, 0, 0), 
TIMEFROMPARTS ( End_hour, End_minute, End_second, 0, 0))),0)
) * 60 
+
Datepart
(
minute,
DATEADD(second,sum(datediff(second, 
TIMEFROMPARTS ( Start_hour, Start_minute, Start_second, 0, 0), 
TIMEFROMPARTS ( End_hour, End_minute, End_second, 0, 0))),0)
) As varchar)
+ 
':'
+
Cast
(
Datepart
(
second,
DATEADD(second,sum(datediff(second, 
TIMEFROMPARTS ( Start_hour, Start_minute, Start_second, 0, 0), 
TIMEFROMPARTS ( End_hour, End_minute, End_second, 0, 0))),0)
) As varchar) as result
from minsec