【问题标题】:How to repeat the values between the two dates?如何重复两个日期之间的值?
【发布时间】:2017-10-25 03:47:20
【问题描述】:

使用 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

假设我想在两个日期之间生成上表值。

例如,

给定日期:开始日期 - 12-02-2009 到结束日期 - 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 查询?

需要查询帮助。

【问题讨论】:

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


    【解决方案1】:

    也试试这个...

     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
    

    【讨论】:

      【解决方案2】:

      另一种解决方案

       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
      

      【讨论】:

        【解决方案3】:

        试试这个

        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
        

        【讨论】:

          猜你喜欢
          • 2014-07-08
          • 2021-05-30
          • 2013-07-05
          • 1970-01-01
          • 1970-01-01
          • 2012-07-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多