[SQL]比較2個日期相差的 年、月、日、時、分、秒

同事問到,如果要比較2個日期相差的 年、月、日、時、分、秒那要如何處理呢?
原本的時、分、秒不要去Care加入的 1900/01/01,
但年、月、日就需要處理哦!

之前有「比較2個時間差多少個小時、分、秒」,

那如果 年、月、日 也要一併顯示出來呢?

這時就不能不管加入的 1900/01/01 (也是0)了,因為要將它減掉!

用以下面的例子來看,


DECLARE @t1 datetime, @t2 datetime 
SET @t1 = '2012-01-01 00:00:00.000'
SET @t2 = '2012-12-31 23:59:00.000'
select DATEADD(s, DATEDIFF(s,@t1,@t2), 0) 
-- 1901-01-01 23:59:00.000
-- 相差 1年0月0日 23:59:00

SET @t1 = '2012-01-01 00:00:00.000'
SET @t2 = '2015-01-01 00:00:00.000'
select DATEADD(s, DATEDIFF(s,@t1,@t2), 0) 
-- 1903-01-02 00:00:00.000
-- 相差 3年0月1日 00:00:00.000

 

所以我們可以建一個 Function 來處理它,如下,

IF OBJECT_ID (N'dbo.ufn_GetDiffDateTime') IS NOT NULL
   DROP FUNCTION dbo.ufn_GetDiffDateTime
GO


CREATE FUNCTION dbo.ufn_GetDiffDateTime (@t1 datetime, @t2 datetime)
RETURNS varchar(30)
AS
BEGIN
    declare @tresult datetime, @result varchar(30)
    set @tresult = DATEADD(s, DATEDIFF(s,@t1,@t2), 0)
    set @result = cast(year(@tresult) - 1900 as varchar) +
            '/' + cast(Month(@tresult) -1  as varchar) +
            '/' + cast(Day(@tresult) -1   as varchar)  +
            ' ' + CONVERT(varchar, @tresult, 108)
    RETURN @result;
END
GO

 

測試如下,


DECLARE @t1 datetime, @t2 datetime 
SET @t1 = '2012-01-01 00:00:00.000'
SET @t2 = '2012-12-31 23:59:00.000'
select DATEADD(s, DATEDIFF(s,@t1,@t2), 0) as d1
	, dbo.ufn_GetDiffDateTime(@t1,@t2) as fd1
 
SET @t1 = '2012-01-01 00:00:00.000'
SET @t2 = '2015-01-01 00:00:00.000'
select DATEADD(s, DATEDIFF(s,@t1,@t2), 0) as d1
	, dbo.ufn_GetDiffDateTime(@t1,@t2) as fd1

image

 

參考資料

比較2個時間差多少個小時、分、秒

把 秒數 轉成 hh:mm:ss 字串

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^