如何获得两个日期之间每月的总天数?

Dip*_*pak 5 sql-server

给定两个日期,例如2012030220120605

我需要获取月份列表以及这两个日期之间的月份的总天数,如下所示:

March 28
April 30
May   31
June  03
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 5

这是我的尝试。不过,仍然认为您的样本数据中有未解决的问题。

DECLARE @s SMALLDATETIME, @e SMALLDATETIME;
SELECT  @s = '20120302',  @e = '20120605';

;WITH n(n) AS
(
  SELECT TOP (DATEDIFF(MONTH, @s, @e)+1) ROW_NUMBER() OVER 
  (ORDER BY [object_id])-1 FROM sys.all_objects
),
x(n,fd,ld) AS 
(
  SELECT n.n, DATEADD(MONTH, n.n, m.m), DATEADD(MONTH, n.n+1, m.m)
  FROM n, (SELECT DATEADD(DAY, 1-DAY(@s), @s)) AS m(m)
)
SELECT [Month] = DATENAME(MONTH, fd), [Days] = DATEDIFF(DAY, fd, ld) 
  - CASE WHEN @s > fd THEN (DATEDIFF(DAY, fd, @s)+1) ELSE 0 END
  - CASE WHEN @e < ld THEN (DATEDIFF(DAY, @e, ld)-1) ELSE 0 END
  FROM x;
Run Code Online (Sandbox Code Playgroud)

结果:

Month  Days
-----  ----
March    29
April    30
May      31
June      5
Run Code Online (Sandbox Code Playgroud)


Mik*_*son 3

您可以使用递归 CTE 构建日期列表并按月分组。这不会为您提供所需的确切输出,但它应该让您了解可以做什么。

declare @D1 date;
declare @D2 date;

set @D1 = '20120302';
set @D2 = '20120605';

with C(TheDate) as
(
  select @D1
  union all
  select dateadd(day, 1, C.TheDate)
  from C
  where C.TheDate < @D2
)
select cast(dateadd(month, datediff(month, 0, C.TheDate), 0) as date) as Month,
       count(*) as DayCount
from C
group by dateadd(month, datediff(month, 0, C.TheDate), 0)
option (maxrecursion 0);
Run Code Online (Sandbox Code Playgroud)

结果:

Month      DayCount
---------- -----------
2012-03-01 30
2012-04-01 30
2012-05-01 31
2012-06-01 5
Run Code Online (Sandbox Code Playgroud)