如何重复两个日期之间的值?

时间:2009-11-03 06:32:56

标签: sql sql-server sql-server-2005

使用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查询?

需要查询帮助。

3 个答案:

答案 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