如何在 SQL Server 2005 中根据月份拆分日期范围 [英] How to split date ranges based on months in SQL Server 2005

查看:23
本文介绍了如何在 SQL Server 2005 中根据月份拆分日期范围的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

例如:日期范围是 01-01-201101-01-2012,我想要这样的输出:

Ex: date range is 01-01-2011 to 01-01-2012, I want the output like this :

 01-01-2011 31-01-2011
 01-02-2011 28-02-2011

我该怎么做?我使用的是 SQL Server 2005..

How can I do this ? I'm using SQL Server 2005..

谢谢

推荐答案

使用 CTE:

DECLARE @Begin DATETIME
DECLARE @End DATETIME

SELECT @Begin = '20110101', @End = '20120101'

;WITH ranges(DateFrom, DateTo) AS
(
  SELECT @Begin, DATEADD(DAY, -1, DATEADD(MONTH, 1, @begin))
  UNION ALL
  SELECT DATEADD(month, 1, DateFrom), DATEADD(DAY, -1, DATEADD(MONTH, 2, DateFrom))
  FROM ranges
  WHERE DateFrom < @End
)
SELECT * FROM ranges
OPTION(MAXRECURSION 0)

并且不使用 CTE:

DECLARE @Begin DATETIME
DECLARE @End DATETIME

SELECT @Begin = '20110101', @End = '20120101'

SELECT DATEADD(MONTH, n.Number, @Begin) DateFrom, DATEADD(day, -1, DATEADD(MONTH, n.Number+1, @Begin)) DateTo
FROM master.dbo.spt_values n
WHERE 
    n.Number < DATEDIFF(MONTH, @begin, @end)
AND n.Type = 'P'

如果您还需要包括 2012 年 1 月,请使用此

If you need to include January 2012 too, use this

DECLARE @Begin DATETIME
DECLARE @End DATETIME

SELECT @Begin = '20110101', @End = '20120101'

SELECT DATEADD(MONTH, n.Number, @Begin) DateFrom, DATEADD(day, -1, DATEADD(MONTH, n.Number+1, @Begin)) DateTo
FROM master.dbo.spt_values n
WHERE 
    n.Number <= DATEDIFF(MONTH, @begin, @end)
AND n.Type = 'P'

和 CTE:

DECLARE @Begin DATETIME
DECLARE @End DATETIME

SELECT @Begin = '20110101', @End = '20120101'

;WITH ranges(DateFrom, DateTo) AS
(
  SELECT @Begin, DATEADD(DAY, -1, DATEADD(MONTH, 1, @begin))
  UNION ALL
  SELECT DATEADD(month, 1, DateFrom), DATEADD(DAY, -1, DATEADD(MONTH, 2, DateFrom))
  FROM ranges
  WHERE DATEADD(month, 1, DateFrom) < @End
)
SELECT * FROM ranges
OPTION(MAXRECURSION 0)

这篇关于如何在 SQL Server 2005 中根据月份拆分日期范围的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆