是否可以在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