给定两个日期,例如20120302和20120605
我需要获取月份列表以及这两个日期之间的月份的总天数,如下所示:
March 28
April 30
May 31
June 03
Run Code Online (Sandbox Code Playgroud)
这是我的尝试。不过,仍然认为您的样本数据中有未解决的问题。
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)
您可以使用递归 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)
| 归档时间: |
|
| 查看次数: |
15300 次 |
| 最近记录: |