所以基本上,因爲這個自定義的日期數學,你需要實現自己的函數來獲得所需的結果。
請參見下面的TSQL
CREATE FUNCTION dbo.getDateSum(@d1 varchar(100), @d2 varchar(100))
RETURNS varchar(100)
WITH EXECUTE AS CALLER
AS
BEGIN
DECLARE @y int, @m int, @d int
Select
@d1= REPLACE(REPLACE(REPLACE(@d1,' years, ', '-'),' months, ','-'),' days',''),
@d2= REPLACE(REPLACE(REPLACE(@d2,' years, ', '-'),' months, ','-'),' days','')
Select
@y= CAST(LEFT(@d1,CHARINDEX('-',@d1)-1) AS INT)+CAST(LEFT(@d2,CHARINDEX('-',@d2)-1) AS INT),
@m= CAST(SUBSTRING(@d1,CHARINDEX('-',@d1)+1,LEN(@d1)-CHARINDEX('-',REVERSE(@d1))-CHARINDEX('-',@d1))AS INT)+CAST(SUBSTRING(@d2,CHARINDEX('-',@d2)+1,LEN(@d2)-CHARINDEX('-',REVERSE(@d2))-CHARINDEX('-',@d2)) AS INT),
@d= CAST(LEFT(REVERSE(@d1),CHARINDEX('-',REVERSE(@d1))-1)AS INT)+CAST(LEFT(REVERSE(@d2),CHARINDEX('-',REVERSE(@d2))-1) AS INT)
IF(@d>30)
BEGIN
SET @[email protected]%30
SET @[email protected]+CAST(@d/30 as INT)
END
IF(@m>30)
BEGIN
SET @[email protected]%12
SET @[email protected]+CAST(@m/12 as INT)
END
RETURN (cast(@y as varchar)+ ' years, ' + cast(@m as varchar) +' months, '+ cast(@d as varchar) + ' days');
END
go
CREATE FUNCTION dbo.getDateDiff(@df date, @dt date)
RETURNS varchar(100)
WITH EXECUTE AS CALLER
AS
BEGIN
declare @y int, @m int, @d int
Select @y= YEAR(@dt)- YEAR(@df),@m= MONTH(@dt)- MONTH(@df),@d=CASE WHEN DAY(@df)=1 THEN DAY(@dt)- DAY(@df)+1 ELSE DAY(@dt)- DAY(@df) -1 END
If (@d<0)
BEGIN
Set @[email protected]
set @[email protected] + DATEDIFF(d, @dt, EOMONTH(@dt))
END
IF(@m<0)
BEGIN
Set @[email protected]
Set @[email protected]+ 12
END
RETURN (cast(@y as varchar)+ ' years, ' + cast(@m as varchar) +' months, '+ cast(@d as varchar) + ' days')
END
go
SELECT dbo.getDateSum(dbo.getDateDiff('2010-02-01','2011-03-11'),dbo.getDateDiff('2010-02-02', '2011-03-11'))
go
很多,非常感謝! getDateDiff完美工作,但是,我需要getDateSum函數來總結許多行 - 有時候2有時候是20(我很抱歉沒有在開始時說明它,你能幫助修改代碼嗎? –