使用SQL Server 2005
我想在两个日期之间生成表值
表1
ID Date Intime Outtime
01 12-02-2009 10:00:00 17:00:00
02 13-02-2009 08:00:00 16:00:00
03 14-02-2009 09:00:00 21:00:00
04 15-02-2009
假设我想在两个日期之间生成上述表值。
例如,
给定日期:开始日期 - 2009年12月12日至结束日期 - 12-03-2009
预期产出,
ID Date Intime Outtime
01 12-02-2009 10:00:00 17:00:00
02 13-02-2009 08:00:00 16:00:00
03 14-02-2009 09:00:00 21:00:00
04 15-02-2009
05 16-02-2009 10:00:00 17:00:00
06 17-02-2009 08:00:00 16:00:00
07 18-02-2009 09:00:00 21:00:00
08 19-02-2009
09 20-02-2009 10:00:00 17:00:00
…,
所以从table1我们有4行,所以4行将重复到给定的结束日期,但id和date应该递增,id和date不应重复。
如何针对这种情况进行SQL查询?
需要查询帮助。
答案 0 :(得分:2)
试试这个......
declare @startdate datetime
declare @enddate datetime
set @startdate = '12-02-2009'
set @enddate = '12-05-2009'
;with num_cte as
(
select top(datediff(day,@startdate,@enddate)) ROW_NUMBER() OVER (ORDER BY c.column_id) AS rn
from sys.columns c
)
, generate_date_cte as
(
select 1 as Id,@startdate as newdate
union all
select rn+1 as Id, newdate
from num_cte
cross apply( select DATEADD(day,rn,@startdate) AS newdate) x
)
select * from generate_date_cte
答案 1 :(得分:0)
试试这个
declare @startdate datetime
declare @enddate datetime
set @startdate = '12-02-2009'
set @enddate = '12-05-2009'
;with generateCalender_cte as
(
select
1 as Id
,@startdate DateValue
union all
select
c.Id + 1
,DateValue + 1
from generateCalender_cte c
where DateValue + 1 <= @enddate
)
select * from generateCalender_cte
答案 2 :(得分:0)
另一种解决方案
declare @startdate datetime
declare @enddate datetime
set @startdate = '12-02-2009'
set @enddate = '12-05-2009'
; with generateCalender_cte as
(
select
1 as Id
,@startdate as newdate
union all
select
c.Id + 1
,DATEADD(day,1,c.newdate)
from generateCalender_cte c
where c.newdate <@enddate
)
select * from generateCalender_cte