sql >> Database teknologi >  >> RDS >> Sqlserver

DATEDIFF i formatet TT:MM:SS

Du bør ikke konvertere til time - det er beregnet til at gemme et tidspunkt på et enkelt 24-timers ur, ikke en varighed eller et interval (selv et, der alene er begrænset til <24 timer, hvilket tydeligvis ikke er dine data). I stedet kan du tage datediff'en i det mindste nødvendige interval (i dit tilfælde sekunder), og derefter udføre nogle matematiske og strengmanipulationer for at præsentere det i det outputformat, du har brug for (det kan også være at foretrække at returnere sekunderne til applikationen eller rapportværktøj og få det til at gøre dette arbejde).

DECLARE @d TABLE
(
  id INT IDENTITY(1,1), 
  StartDateTime DATETIME, 
  EndDateTime DATETIME
);

INSERT @d(StartDateTime, EndDateTime) VALUES 
(DATEADD(DAY, -2, GETDATE()), DATEADD(MINUTE, 15, GETDATE())),
(GETDATE()                  , DATEADD(MINUTE, 22, GETDATE())),
(DATEADD(DAY, -1, GETDATE()), DATEADD(MINUTE,  5, GETDATE())),
(DATEADD(DAY, -4, GETDATE()), DATEADD(SECOND, 14, GETDATE()));

;WITH x AS (SELECT id, StartDateTime, EndDateTime, 
  d = DATEDIFF(SECOND, StartDateTime, EndDateTime),
  a = AVG(DATEDIFF(SECOND, StartDateTime, EndDateTime)) OVER()
  FROM @d
)
SELECT id, StartDateTime, EndDateTime,
  [delta_HH:MM:SS] = CONVERT(VARCHAR(5), d/60/60)
  + ':' + RIGHT('0' + CONVERT(VARCHAR(2), d/60%60), 2)
  + ':' + RIGHT('0' + CONVERT(VARCHAR(2), d % 60), 2),
  [avg_HH:MM:SS] = CONVERT(VARCHAR(5), a/60/60)
  + ':' + RIGHT('0' + CONVERT(VARCHAR(2), a/60%60), 2)
  + ':' + RIGHT('0' + CONVERT(VARCHAR(2), a % 60), 2)
FROM x;
 

Resultater:

id  StartDateTime        EndDateTime          delta_HH:MM:SS  avg_HH:MM:SS
--  -------------------  -------------------  --------------  ------------
1   2013-01-19 14:24:46  2013-01-21 14:39:46  48:15:00        42:10:33
2   2013-01-21 14:24:46  2013-01-21 14:46:46   0:22:00        42:10:33
3   2013-01-20 14:24:46  2013-01-21 14:29:46  24:05:00        42:10:33
4   2013-01-17 14:24:46  2013-01-21 14:25:00  96:00:14        42:10:33
 

Dette er ikke præcist, hvad du bad om, da det ikke kun vil vise MM:SS for deltaer <1 time. Du kan justere det med en simpel CASE udtryk:

;WITH x AS (SELECT id, StartDateTime, EndDateTime, d = DATEDIFF(SECOND, StartDateTime, EndDateTime), a = AVG(DATEDIFF(SECOND, StartDateTime, EndDateTime)) OVER() FROM @d ) SELECT id, StartDateTime, EndDateTime, [delta_HH:MM:SS] = CASE WHEN d >= 3600 THEN CONVERT(VARCHAR(5), d/60/60) + ':' ELSE '' END + RIGHT('0' + CONVERT(VARCHAR(2), d/60%60), 2) + ':' + RIGHT('0' + CONVERT(VARCHAR(2), d % 60), 2), [avg_HH:MM:SS] = CASE WHEN a >= 3600 THEN CONVERT(VARCHAR(5), a/60/60) + ':' ELSE '' END + RIGHT('0' + CONVERT(VARCHAR(2), a/60%60), 2) + ':' + RIGHT('0' + CONVERT(VARCHAR(2), a % 60), 2) FROM x;

Denne forespørgsel ændrer deltakolonnen i 2. række i ovenstående resultat fra 0:22:00 til 22:00 .



  1. MySQL ODBC-stik 32bit eller 64bit?

  2. Sådan udfyldes oplysninger i kolonner til e-mail

  3. Vis sidste adgangstidspunkt for en tabel i Oracle DB

  4. Forbedre hvordan man får antallet af tilfælde for hver særskilt værdi af Group Concat Mysql