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

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

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

开始日期 = 01/01/2010
日期结束 = 10/21/2012

结果: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

谢谢!

最佳答案

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

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

关于sql-server - 日期之间的差异 - sql server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12588720/

相关文章:

python - 如何在 EDA 过程中使用 Pandas DateTime 识别时间差异

php - DateTime 类和上个月

php - 如何将 MySQL DATEDIFF 查询的结果作为变量传递给 PHP 函数?

sql-server - 使用 SQL Server Management Studio 2005 导出时使用 UTF-8 编码保存 CSV

sql-server - 如何将 SQL Server 2008 数据库图表导出到另一个数据库?

datetime - 在Notepad++中,如何插入当前日期和时间?

mysql - Laravel where 子句与 DATEDIFF()

php - 如何使用日期差异?两个日期之间有多少天

sql - 这可以用一个简单的语句来简化吗?

sql - 在 SQL Server 中从 JSON 中的数组获取值