是否可以在SQL中执行:例如,我有句点where @s_date = '20130101' and @e_date = '20130601',并且我想选择此期间内所有月份的最后几天。

这是结果示例:

20130131
20130228
20130331
20130430
20130531

谢谢。

最佳答案

最简单的选择是使用calendar table,并带有每月的最后一天标志,因此您的查询将很简单:

SELECT  *
FROM    dbo.Calendar
WHERE   Date >= @StartDate
AND     Date <= @EndDate
AND     EndOfMonth = 1;

当然,假设您没有日历表,则可以即时生成日期列表:'
DECLARE @s_date DATE = '20130101',
        @e_date DATE = '20130601';

SELECT  Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY Object_ID) - 1, @s_date)
FROM    sys.all_objects;

然后,一旦有了日期,就可以将它们限制为日期是该月的最后一天的地方(添加一天即成为该月的第一天):
DECLARE @s_date DATE = '20130101',
        @e_date DATE = '20130601';

WITH Dates AS
(   SELECT  Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY Object_ID) - 1, @s_date)
    FROM    sys.all_objects
)
SELECT  *
FROM    Dates
WHERE   Date <= @e_Date
AND     DATEPART(DAY, DATEADD(DAY, 1, Date)) = 1;

Example on SQL Fiddle

10-08 06:51