【问题标题】:Difference between dates - sql server日期之间的差异 - sql server
【发布时间】:2023-03-08 17:19:01
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 你确定预期结果是 1 年 9 个月还是 2 年 9 个月
  • 如果开始日期是2010-01-192010-01-21,你想要什么?
  • 无论您如何获得结果,请小心处理输出。请记住,一个月不是一个精确的时间单位。如果您的用户知道其中一点,例如“三个月后”或“三个月前”,那很好。但是没有参考点,“月”是没有意义的。

标签: sql-server datetime datediff sql-date-functions


【解决方案1】:

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

如果考虑闰年的额外一天至关重要,我相信可以对其进行调整以应对这一问题。尽管通过最少的测试,我无法看到它会崩溃的任何情况(只是感觉它不应该工作)。

【讨论】:

    【解决方案2】:

    试试这个

    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
    

    【讨论】:

    • 这不会输出天数(也不会考虑闰年)。
    • 现在将开始日期更改为2010-01-22...我注意到我的也有类似的问题。
    【解决方案3】:

    您可以使用函数获取日期差异也可以看到这个 http://atikpassion.blogspot.com/2014/01/get-difference-between-two-dates-in.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 2018-08-01
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多