2012-09-25 112 views
2

我需要得到兩個日期之間的結果如下:- SQL服務器

DATE_START = 01/01/2010
DATE_END = 2012年10月21日

結果:1年,9數月和20天。

我試了下面的代碼,但它沒有奏效。它有時會返回負值日期:

SELECT CAST(DATEDIFF(yy, date_start, date_end) AS varchar(4)) +' year '+ 
     CAST(DATEDIFF(mm, DATEADD(yy, DATEDIFF(yy,date_start , date_end), date_start), date_end) AS varchar(2)) +' month '+ 
     CAST(DATEDIFF(dd, DATEADD(mm, DATEDIFF(mm, DATEADD(yy, DATEDIFF(yy, date_start, date_end), date_start), date_end), DATEADD(yy, DATEDIFF(yy, date_start, date_end), date_start)), date_end) AS varchar(2)) +' day' AS result 

謝謝!

+4

你確定預期的結果爲1年9個月或2歲9個月 –

+0

,做你想要什麼,如果開始日期是'2010-01-19'得到的時間差或'2010-01-21'? –

+0

無論您如何得到結果,請注意您對輸出所做的事情。請記住,一個月不是一個精確的時間單位。如果你的用戶知道其中的一點,比如「從現在開始的三個月」或「三個月前」,那很好。但沒有一個參考點,一個「月」是毫無意義的。 –

回答

2

可能不能正確處理閏年如果@s@e相鄰他們,但除此之外,這應該是八九不離十:

DECLARE @s DATE, @e DATE 

SELECT @s = '20100101', @e = '20121021'; 

SELECT y + ' year(s), ' + m + ' month(s) and ' + d + ' day(s).' 
FROM 
(
    SELECT 
    RTRIM(y), 
    RTRIM(m - CASE WHEN pd < 0 THEN 1 ELSE 0 END), 
    RTRIM(CASE WHEN pd < 0 THEN nd ELSE pd END) 
    FROM 
    (
    SELECT 
     DATEDIFF(MONTH, @s, @e)/12, 
     DATEDIFF(MONTH, @s, @e) % 12, 
     DATEDIFF(DAY, @s, DATEADD(MONTH, -DATEDIFF(MONTH, @s, @e), @e)), 
     DATEDIFF(DAY, @s, DATEADD(MONTH, 1-DATEDIFF(MONTH, @s, @e), @e)) 
) AS x (y, m, pd, nd) 
) AS y (y, m, d); 

輸出:

2 year(s), 9 month(s) and 20 day(s). 

如果考慮閏年的額外一天是至關重要的,我相信它可以通過調整來處理。雖然通過最小的測試,但我無法看到任何會破壞的情況(它只是不覺得它應該工作)。

0

試試這個

DECLARE @months decimal (5,2) 
SELECT @months = DATEDIFF(month, '01/22/2010','10/21/2012')/12.0 

;WITH CTE AS 
(
SELECT FLOOR(@months) AS years,(@months-FLOOR(@months)) * 12 AS months 
) 
SELECT years, CAST(months as int) months, 
case when day('01/22/2010') > day('10/21/2012') 
then day('10/21/2012') + 
datediff(day,'01/22/2010',dateadd(month,datediff(month,0,'01/22/2010')+1,0))- 1 
ELSE day('10/21/2012')-day('01/22/2010') end 
from cte 
+2

這不會輸出天(也不會計算閏年)。 –

+1

我已更新爲包含日期 –

+0

現在將開始日期更改爲'2010-01-22' ...我注意到我的問題也有類似問題。 –