Sql server 日期之间的差异-sql server

Sql server 日期之间的差异-sql server,sql-server,datetime,datediff,sql-date-functions,Sql Server,Datetime,Datediff,Sql Date Functions,我需要在两个日期之间得到以下结果: 开始日期=2010年1月1日 日期=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_en

我需要在两个日期之间得到以下结果:

开始日期=2010年1月1日
日期=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
谢谢大家!

试试这个

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
如果
@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);

如果考虑闰年中额外的一天是至关重要的,我相信它可以调整来处理这个问题。虽然通过最少的测试,我看不到任何情况下它会破裂(只是感觉它不应该工作)。

您可以使用函数获得日期差异,也可以看到这一点

您确定预期结果是1年9个月还是2年9个月?如果开始日期是
2010-01-19
2010-01-21
,您想要什么?无论您如何获得结果,请小心处理输出。记住,一个月不是一个精确的时间单位。如果您的用户知道其中一点,例如“从现在起三个月”或“三个月前”,则可以。但是如果没有参考点,“月”是没有意义的。它不会输出天(也不会计算闰年)。现在将开始日期更改为
2010-01-22
。。。我注意到我的有一个类似的问题。
2 year(s), 9 month(s) and 20 day(s).