简体   繁体   中英

How to split date ranges based on months in SQL Server 2005

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

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

Thanks

Using 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)

And not using 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'

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'

And 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)
>On Providing the Start and End Date range, it can be split into months. This might help.
DECLARE @StartDate   datetime 
DECLARE @EndDate     datetime
DECLARE @tmpStart    datetime
DECLARE @tmpEnd      datetime

Select @StartDate   = '2012-01-01'
Select @EndDate     = '2009-01-01'

Select @StartDate = DATEADD(MONTH,1,Convert(DATETIME,Convert(VARCHAR(25), Datepart (YEAR,@StartDate)) + '-' +  Convert(VARCHAR(25), Datepart(MONTH, @StartDate)) + '-' + Convert(VARCHAR(25), 1))) 

Select @EndDate = DATEADD(MONTH,1,Convert(DATETIME,Convert(VARCHAR(25), Datepart(YEAR, @EndDate)) + '-' + Convert(VARCHAR(25), Datepart(MONTH, @EndDate)) + '-' + Convert(VARCHAR(25), 1)))

Select @EndDate = DATEADD(DD,-1, DATEADD(MM,1,@EndDate))

Select @tmpEnd = @EndDate
Select @tmpStart = Convert(DATETIME,Convert(VARCHAR(25), Datepart(YEAR, @tmpEnd)) + '-' + 
                  Convert(VARCHAR(25), Datepart(MONTH, @tmpEnd)) + '-' + Convert(VARCHAR(25), 1)) 

Select @StartDate 'Start' , @EndDate 'End' 

While @tmpStart <= @StartDate 
BEGIN   
    Select @tmpStart 'tmpStart' , @tmpEnd 'tmpEnd'  
    Select @tmpStart = DATEADD(MM,1,@tmpStart)
    Select @tmpEnd   = DATEADD(DD,-1,DATEADD (MM, 1 , @tmpStart)) 
END

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM