同事問到,如果要比較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
參考資料
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^