2012-11-27 70 views
24

我在計算兩個日期之間的時間差時遇到了一些困難。兩個日期之間的SQL時間差導致hh:mm:ss

我要的是,我有兩個日期,讓說

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

所以在hh:mm:ss形式的兩個日期之間的差值爲72:42:30

如何在T-SQL查詢中獲得此結果?

+0

[用T-SQL計算時間跨度(可能重複http://stackoverflow.com/questions/758891/calculating-timespan- with-t-sql) – Pfitz

回答

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] 

此查詢會對您有所幫助。

+2

我看到的區別只是'as [hh:mm:ss]'。所以不要添加重複的答案。 – hims056

9

雖然也許不是最有效的,這會工作:

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)) 

,如果你可以運行兩個選擇那麼這將是更好,因爲你只能做DATEDIFF一次:

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

非常感謝Greg。它的工作真棒。非常感激。 –

0

看看這些。我沒有使用更多的括號來保持它的可讀性,所以請記住,乘法在加法或減法之前完成。

都低於回報:

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

這是寫入不使用子查詢和最易於閱讀和理解:

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 

這是將執行,如果你更好的一個版本有很多數據。它需要一個子查詢。

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

我碰到這篇文章今天來,因爲我是試圖收集位於單獨的表中的字段之間的時間差上的一個關鍵領域結合在一起。這是這種努力的工作代碼。 (在sql 2010中測試過) 請注意,我的原始查詢將共同的6個表共同鍵入字段中,在下面的代碼中,我刪除了其他表,以免對讀者造成混淆。

查詢的目的是計算變量CreatedUTC & BackupUTC之間的差異,其中差異以天爲單位表示,並且該字段被稱爲「DaysActive」。

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 

輸出將是如下:

[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

聲明@StartDate日期時間, @EndDate日期時間

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

結果是:「01:12:30」。 – Wodzu

0

這是一個腳本撰寫,然後拷貝到您的腳本文件和更改寫 您要求的領域並退出

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

如果你不反對隱式類型轉換,我會提供這個替代解決方案。更好的格式化可讀性更高嗎?你是法官。

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

在單個select語句中,我有一列將來會返回一個時間,第二列是getdate(),第三列將分別用dt2和dt1替代未來日期和getdate()的定義。 返回值是 2017年4月12日21:00:00.000 \t 2017年4月11日10:14:20.590 \t 13時14分21秒 通過我的數學應該有大約24 + 11小時,也就是說,他們之間35小時,而不是13. – youcantryreachingme

19

最短的代碼將是:

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

只有當差值小於24小時時才起作用.... – Waqas

+1

此外,這僅適用於datetime數據類型,而不適用於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] 

這將幫助你太

1

我喜歡製作成所以它的功能這個的想法變得可重複使用,您的查詢變得更容易閱讀:

--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 

用法:

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 

結果:

DateDifference 
1 73:12:30 

它也更容易,如果你添加填充所以格式始終hh:mm:ss讀結果。例如,這裏是你會怎麼做,在SQL Server 2012中或更高版本:

--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 

注意,這將不會剪輯小時,如果超過2個位數。所以1小時將顯示爲01:00:00 100小時將顯示爲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)