使用2个日期参数之间的日期填充临时表的最简单方法

mam*_*esh 22 sql t-sql sql-server-2005

使用日期(包括2个日期参数之间)填充临时表的最简单方法是什么.我只需要每月的第一天约会.

例如,如果@StartDate ='2011-01-01'和@EndDate ='2011-08-01'

然后我希望在表格中返回

2011-01-01
2011-02-01
2011-03-01
2011-04-01
2011-05-01
2011-06-01
2011-07-01
2011-08-01
Run Code Online (Sandbox Code Playgroud)

Gil*_*ilM 24

即使@StartDate不是本月的第一个,这也有效.我假设如果它不是本月的开始,你想要从下个月的第一天开始.否则删除+1:

;WITH cte AS (
SELECT CASE WHEN DATEPART(Day,@StartDate) = 1 THEN @StartDate 
            ELSE DATEADD(Month,DATEDIFF(Month,0,@StartDate)+1,0) END AS myDate
UNION ALL
SELECT DATEADD(Month,1,myDate)
FROM cte
WHERE DATEADD(Month,1,myDate) <=  @EndDate
)
SELECT myDate
FROM cte
OPTION (MAXRECURSION 0)
Run Code Online (Sandbox Code Playgroud)


小智 16

declare @StartDate date = '2014-01-01';
declare @EndDate date = '2014-05-05';

;WITH cte AS (
    SELECT @StartDate AS myDate
    UNION ALL
    SELECT DATEADD(day,1,myDate) as myDate
    FROM cte
    WHERE DATEADD(day,1,myDate) <=  @EndDate
)
SELECT myDate
FROM cte
OPTION (MAXRECURSION 0)
Run Code Online (Sandbox Code Playgroud)


Ica*_*rus 7

declare @StartDate datetime
declare @EndDate datetime
select @StartDate = '2011-01-01' ,  @EndDate = '2011-08-01'

select @StartDate= @StartDate-(DATEPART(DD,@StartDate)-1)

declare @temp  table
(
TheDate datetime
)
while (@StartDate<=@EndDate)
begin
insert into @temp
values (@StartDate )
select @StartDate=DATEADD(MM,1,@StartDate)
end
select * from @temp
Run Code Online (Sandbox Code Playgroud)

即使@StartDate不是本月的第一天,也可以回到StartDate月初的第一天


mhd*_*awi 6

这是在SQL 2008 R2中测试的

Declare @StartDate datetime = '2015-03-01'
Declare @EndDate datetime = '2015-03-31'
declare @temp Table
(
DayDate datetime
);

WHILE @StartDate <= @EndDate
begin
 INSERT INTO @temp (DayDate) VALUES (@StartDate);
 SET @StartDate = Dateadd(Day,1, @StartDate);
end ;

select * from @temp
Run Code Online (Sandbox Code Playgroud)

结果:

DayDate
-----------------------
2015-03-01 00:00:00.000
2015-03-02 00:00:00.000
2015-03-03 00:00:00.000
2015-03-04 00:00:00.000
...
Run Code Online (Sandbox Code Playgroud)