【问题标题】:Converting 1 record with a start and end date into multiple records for each day将具有开始和结束日期的 1 条记录转换为每天的多条记录
【发布时间】:2014-10-11 16:55:06
【问题描述】:

我想知道一种有效的方法来获取具有开始日期和结束日期的事件记录,并基本上在开始日期和结束日期之间的每一天复制该记录

因此,开始日期为 2014-01-01,结束日期为 2014-01-03 的记录将变为 3 条记录,每天一条

如果有帮助,我有一个日期表。我正在使用 SQL Server 2012

谢谢

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    由于您已经有日期表,您可以将您的表与日期表一起加入,以使所有日期与您的开始和结束日期具有相同的记录

     SELECT A.data,
        DT.startDate,
        DT.endDate
     FROM
     DateTable DT
     JOIN A
     ON A.StartDate >= DT.startDate
     And A.EndDate <= DT.endDate
    

    【讨论】:

    • 你太棒了..正是我需要的..我修改和定制..它在 MS Access 查询中完美运行。
    【解决方案2】:

    使用这个查询

    declare @startDate datetime = getdate()
    declare @endDate datetime = dateadd(day,10,getdate())
    
    
    ;with days as 
    (
        select
            @startDate as StartDate,
            @endDate as EndDate,
            @startDate as CurrentDate,
            0 as i
        union all
        select 
            d.StartDate,
            d.EndDate,
            dateadd(day,d.i + 1,@startDate) as CurrentDate,
            d.i + 1 as i
        from days d
        where dateadd(day,d.i + 1,@startDate) < d.EndDate
    )
    select
    *
    from days d
    

    【讨论】:

    • 这只是日期的生成,OP已经有日期表,需要将他当前的tar数据扩展到所有这些日期
    【解决方案3】:

    试试这个

    DECLARE @dt1 Datetime='2014-01-01'
    DECLARE @dt2 Datetime='2014-01-03'
    ;WITH ctedaterange
         AS (SELECT [Dates]=@dt1
             UNION ALL
             SELECT [dates] + 1
             FROM   ctedaterange
             WHERE  [dates] + 1<= @dt2)
    SELECT [dates]
    FROM   ctedaterange
    OPTION (maxrecursion 0)
    

    【讨论】:

      【解决方案4】:
      SELECT COl1,COL2, split.a.value('.', 'VARCHAR(100)') data 
      FROM   (SELECT COl1,COL2, Cast ('<M>' 
                           + Replace(LEFT(Replicate(NAME+',', datediff(dd,startdate,endate),    Len(Replicate(NAME+',', datediff(dd,startdate,endate)))-1), ',''</M><M>') 
                       + '</M>' AS XML) AS Data 
          FROM   tablename) AS A 
         CROSS apply data.nodes ('/M') AS Split(a) 
      

      【讨论】:

        【解决方案5】:

        查询

        DECLARE @StartDate DATE = '2014-01-01',
                @EndDate   DATE = '2014-01-03';
        
        SELECT TOP (DATEDIFF(DAY, @StartDate, @EndDate) + 1)
              DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.number) - 1, @StartDate) AS Date_Range
        FROM master..spt_values a
                           CROSS APPLY master..spt_values b;
        

        结果

        Date_Range
        2014-01-01
        2014-01-02
        2014-01-03
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-24
          • 2020-05-07
          • 1970-01-01
          • 2020-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多