SSh*_*hab 1 sql sql-server-2005
例如:日期范围是01-01-2011对01-01-2012的,我想是这样的输出:
01-01-2011 31-01-2011
01-02-2011 28-02-2011
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点 ?我正在使用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)
Run Code Online (Sandbox Code Playgroud)
而不是使用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'
Run Code Online (Sandbox Code Playgroud)
如果您还需要包括2012年1月,请使用此选项
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'
Run Code Online (Sandbox Code Playgroud)
和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)
Run Code Online (Sandbox Code Playgroud)