2012-11-27 14 views
24

Sto riscontrando qualche difficoltà nel calcolare la differenza di orario tra due date.La differenza di tempo SQL tra due date ha come risultato hh: mm: ss

Quello che voglio è che ho due date diciamo

@StartDate = '10/01/2012 08:40:18.000' 
@EndDate='10/04/2012 09:52:48.000' 

quindi la differenza tra due date sotto forma di hh:mm:ss è 72:42:30.

Come posso ottenere questo risultato in una query T-SQL?

+0

possibile duplicato di [periodo Calcolo con T-SQL] (http://stackoverflow.com/questions/758891/calculating-timespan- with-t-sql) – Pfitz

risposta

34
declare @StartDate datetime, @EndDate datetime 

select @StartDate = '10/01/2012 08:40:18.000',@EndDate='10/04/2012 09:52:48.000' 

select convert(varchar(5),DateDiff(s, @startDate, @EndDate)/3600)+':'+convert(varchar(5),DateDiff(s, @startDate, @EndDate)%3600/60)+':'+convert(varchar(5),(DateDiff(s, @startDate, @EndDate)%60)) as [hh:mm:ss] 

Questa domanda ti sarà utile.

+2

Vedo che la differenza è solo 'come [hh: mm: ss]'. Quindi non aggiungere risposte duplicate. – hims056

9

Mentre forse non il più efficiente, questo dovrebbe funzionare:

declare @StartDate datetime, @EndDate datetime 

select @StartDate = '10/01/2012 08:40:18.000',@EndDate='10/04/2012 09:52:48.000' 

select convert(varchar(5),DateDiff(s, @startDate, @EndDate)/3600)+':'+convert(varchar(5),DateDiff(s, @startDate, @EndDate)%3600/60)+':'+convert(varchar(5),(DateDiff(s, @startDate, @EndDate)%60)) 

se è possibile eseguire due seleziona quindi questo sarebbe meglio, perché si fa solo il datediff volta:

declare @StartDate datetime, @EndDate datetime 

select @StartDate = '10/01/2012 08:40:18.000',@EndDate='10/04/2012 09:52:48.000' 
declare @Sec BIGINT 

select @Sec = DateDiff(s, @startDate, @EndDate) 

select convert(varchar(5),@sec/3600)+':'+convert(varchar(5),@sec%3600/60)+':'+convert(varchar(5),(@sec%60)) 
+0

Grazie mille Greg. È fantastico. Molto apprezzato. –

0

Dai un'occhiata a questi. Non ho usato più parentesi per tenerlo leggibile, quindi ricorda che la moltiplicazione viene eseguita prima di aggiungere o sottrarre.

sia al di sotto di ritorno:

hr mins sec timediff 
73 12 30 73:12:30 

Questo è scritto di non utilizzare un sub-query e di essere il più leggibile e comprensibile:

declare @StartDate datetime, 
@EndDate datetime 

set @StartDate = '10/01/2012 08:40:18.000' 
set @EndDate = '10/04/2012 09:52:48.000' 

select datediff(hour, @StartDate, @EndDate) hr, 
    datediff(minute, @StartDate, @EndDate) 
    - datediff(hour, @StartDate, @EndDate) * 60 mins, 
    datediff(second, @StartDate, @EndDate) 
    - (datediff(minute, @StartDate, @EndDate) * 60) sec, 
    cast(datediff(hour, @StartDate, @EndDate) as varchar)+':'+ 
    cast(datediff(minute, @StartDate, @EndDate) 
    - datediff(hour, @StartDate, @EndDate) * 60 as varchar)+':'+ 
    cast(datediff(second, @StartDate, @EndDate) 
    - (datediff(minute, @StartDate, @EndDate) * 60) as varchar) timediff 

Questa è una versione che potrebbe funzionare meglio se si avere molti dati Richiede una sotto-query.

declare @StartDate datetime, 
@EndDate datetime 

set @StartDate = '10/01/2012 08:40:18.000' 
set @EndDate = '10/04/2012 09:52:48.000' 

select s.seconds/3600 hrs, 
s.seconds/60 - (seconds/3600) * 60 mins, 
s.seconds - (s.seconds/60) * 60 seconds, 
cast(s.seconds/3600 as varchar) + ':' + 
cast((s.seconds/60 - (seconds/3600) * 60) as varchar) + ':' + 
cast((s.seconds - (s.seconds/60) * 60) as varchar) timediff 
from (select datediff(second, @StartDate, @EndDate) as seconds) s 
0

mi sono imbattuto in questo post di oggi mentre stavo cercando di raccogliere la differenza di tempo tra i campi situati in tavoli separati uniti insieme in un campo chiave. Questo è il codice di lavoro per tale sforzo. (testato in sql 2010) Bare a mente che la mia query originale ha unito 6 tabelle su un campo chiave comune, nel codice seguente ho rimosso le altre tabelle in modo da non causare alcuna confusione per il lettore.

Lo scopo della query è calcolare la differenza tra le variabili CreatedUTC & BackupUTC, dove la differenza è espressa in giorni e il campo è denominato "GiorniAttivi".

declare @CreatedUTC datetime 
declare @BackupUtc datetime 


SELECT TOP 500 

table02.Column_CreatedUTC AS DeviceCreated, 
CAST(DATEDIFF(day, table02.Column_CreatedUTC, table03.Column_EndDateUTC) AS nvarchar(5))+ ' Days' As DaysActive, 
table03.Column_EndDateUTC AS LastCompleteBackup 

FROM 

Operations.table01 AS table01 

LEFT OUTER JOIN 

    dbo.table02 AS table02 
ON 
    table02.Column_KeyField = table01.Column_KeyField 

LEFT OUTER JOIN 

    dbo.table03 AS table03 
ON 
    table01.Column_KeyField = table03.Column_KeyField 

Where table03.Column_EndDateUTC > dateadd(hour, -24, getutcdate()) --Gathers records with an end date in the last 24 hours 
AND table02.[Column_CreatedUTC] = COALESCE(@CreatedUTC, table02.[Column_CreatedUTC]) 
AND table03.[Column_EndDateUTC] = COALESCE(@BackupUTC, table03.[Column_EndDateUTC]) 

GROUP BY table03.Column_EndDateUTC, table02.Column_CreatedUTC 
ORDER BY table02.Column_CreatedUTC ASC, DaysActive, table03.Column_EndDateUTC DESC 

l'uscita sarà il seguente:

[DeviceCreated]..[DaysActive]..[LastCompleteBackup] 
--------------------------------------------------------- 
[2/13/12 16:04]..[463 Days]....[5/21/13 12:14] 
[2/12/13 22:37]..[97 Days].....[5/20/13 22:10] 
-1

dichiarare @StartDate datetime, @EndDate datetime

set @StartDate = '10/01/2012 08:40:18.000' 
set @EndDate = '10/04/2012 09:52:48.000' 

SELECT CONVERT(CHAR(8), CAST(CONVERT(varchar(23),@EndDate,121) AS DATETIME) 
-CAST(CONVERT(varchar(23),@StartDate,121)AS DATETIME),8) AS TimeDiff 
+0

Questo dà come risultato "01:12:30". – Wodzu

0

E 'uno script Copy Scrivere poi scrivere nel file di script e il cambiamento il campo requered e uscire put

DECLARE @Sdate DATETIME, @Edate DATETIME, @Timediff VARCHAR(100) 
SELECT @Sdate = '02/12/2014 08:40:18.000',@Edate='02/13/2014 09:52:48.000' 
SET @Timediff=DATEDIFF(s, @Sdate, @Edate) 
SELECT CONVERT(VARCHAR(5),@Timediff/3600)+':'+convert(varchar(5),@Timediff%3600/60)+':'+convert(varchar(5),@Timediff%60) AS TimeDiff 
4

Se non si è contrari al tipo di trasmissione implicita, offrirò questa soluzione alternativa. È più leggibile con una migliore formattazione? Tu sei il giudice

DECLARE @StartDate datetime = '10/01/2012 08:40:18.000' 
     ,@EndDate datetime = '10/04/2012 09:52:48.000' 

SELECT 
    STR(ss/3600, 5) + ':' + RIGHT('0' + LTRIM(ss%3600/60), 2) + ':' + RIGHT('0' + LTRIM(ss%60), 2) AS [hh:mm:ss] 
FROM (VALUES(DATEDIFF(s, @StartDate, @EndDate))) seconds (ss) 
0
DECLARE @StartDate datetime = '10/01/2012 08:40:18.000' 
     ,@EndDate datetime = '10/10/2012 09:52:48.000' 
     ,@DaysDifferent int = 0 
     ,@Sec BIGINT 

select @Sec = DateDiff(s, @StartDate, @EndDate) 

IF (DATEDIFF(day, @StartDate, @EndDate) > 0) 
    BEGIN 
     select @DaysDifferent = DATEDIFF(day, @StartDate, @EndDate) 
     select @Sec = @Sec - (@DaysDifferent * 86400) 
     SELECT LTRIM(STR(@DaysDifferent,3)) +'d '+ LTRIM(STR(@Sec/3600, 5)) + ':' + RIGHT('0' + LTRIM(@Sec%3600/60), 2) + ':' + RIGHT('0' + LTRIM(@Sec%60), 2) AS [dd hh:mm:ss] 
    END 
ELSE 
    BEGIN 
     SELECT LTRIM(STR(@DaysDifferent,3)) +'d '+ LTRIM(STR(@Sec/3600, 5)) + ':' + RIGHT('0' + LTRIM(@Sec%3600/60), 2) + ':' + RIGHT('0' + LTRIM(@Sec%60), 2) AS [dd hh:mm:ss] 
    END 

---------------------------------------------------------------------------------- 
dd HH:MM:SS 
9d 1:12:30 
2
DECLARE @dt1 datetime='2012/06/13 08:11:12', @dt2 datetime='2012/06/12 02:11:12' 

SELECT CAST((@[email protected]) as time(0)) 
+0

All'interno di una singola istruzione select, ho una colonna che restituisce un orario nel futuro, una seconda colonna è getdate() e una terza colonna usa la logica che sostituisce dt2 e dt1 con la definizione della data futura e di getdate() rispettivamente. valori di restituzione sono 2017/04/12 21: 00: 00.000 \t 2017/04/11 10: 14: 20,590 \t 13:14:21 A mio parere la matematica non ci dovrebbero essere circa 24 + 11 ore, ovvero, 35 ore tra di loro, non 13. – youcantryreachingme

19

Il codice più breve sarebbe:

Select CAST((@[email protected]) as time(0)) '[hh:mm:ss]' 
+5

ha funzionato solo quando la differenza è inferiore a 24 ore .... – Waqas

+1

Anche questo funziona solo con il tipo di dati datetime, non con il datatype datetime2 – reedstonefood

0
declare @StartDate datetime, @EndDate datetime 

select @StartDate = '2016-05-04 10:23:41.083',@EndDate='2016-05-04 10:25:26.053' 

select CAST(DateDiff(MI, @startDate, @EndDate)/60 AS varchar)+':'+Cast(DateDiff(MI, @startDate, @EndDate)%60 AS varchar)+':'+cast(DateDiff(s, @startDate, @EndDate)%60 AS varchar) as [hh:mm:ss] 

questo vi aiuterà anche

1

Mi piace l'idea di fare questo in una funzione in modo che diventa riutilizzabile e le tue domande diventano molto più facili da leggere:

--get the difference between two datetimes in the format: 'h:m:s' 
CREATE FUNCTION getDateDiff(@startDate DATETIME, @endDate DATETIME) 
RETURNS VARCHAR(10) 
AS BEGIN 
    DECLARE @seconds INT = DATEDIFF(s, @startDate, @endDate) 
    DECLARE @difference VARCHAR(10) = 
    CONVERT(VARCHAR(4), @seconds/3600) + ':' + 
    CONVERT(VARCHAR(2), @seconds % 3600/60) + ':' + 
    CONVERT(VARCHAR(2), @seconds % 60) 
    RETURN @difference 
END 

Usage:

DECLARE @StartDate DATETIME = '10/01/2012 08:40:18.000' 
DECLARE @endDate DATETIME = '10/04/2012 09:52:48.000' 

SELECT dbo.getDateDiff(@startDate, @endDate) AS DateDifference 

Risultato:

DateDifference 
1 73:12:30 

E 'anche più facile da leggere il risultato se si aggiunge imbottitura in modo che il formato è sempre hh:mm:ss. Ad esempio, ecco come si potrebbe farlo in SQL Server 2012 o versioni successive:

--get the difference between two datetimes in the format: 'hh:mm:ss' 
CREATE FUNCTION getDateDiff(@startDate DATETIME, @endDate DATETIME) 
RETURNS VARCHAR(10) 
AS BEGIN 
    DECLARE @seconds INT = DATEDIFF(s, @startDate, @endDate) 
    DECLARE @difference VARCHAR(10) = 
    FORMAT(@seconds/3600), '00') + ':' + 
    FORMAT(@seconds % 3600/60, '00') + ':' + 
    FORMAT(@seconds % 60, '00') 
    RETURN @difference 
END 

Nota che questo non agganciare l'ora se è lunga più di 2 cifre. Quindi 1 ora rivelerebbe come 01:00:00 e 100 ore rivelerebbe come 100:00:00

-1
declare @StartDate datetime; 
declare @EndDate datetime; 
select @StartDate = '10/01/2012 08:40:18.000'; 
select @EndDate='10/04/2012 09:52:48.000'; 
select cast(datediff(hour,@StartDate,@EndDate) as varchar(10)) + left(right(cast(cast(cast((@[email protected]) as datetime) as time) as varchar(16)),14),6) 
Problemi correlati