我可以根据 SQL 中的开始日期和结束日期复制整行吗

Can I Duplicate an Entire Row based on a Beginning Date and Ending Date in SQL

在 SQL Server Management Studio 中,有没有办法获取一些具有开始日期和结束日期的 excel 数据,并让它获取初始开始日期并按月复制记录直到结束日期,请参阅示例我有一个包含数据的电子表格,我需要按月将其转换为下面的数据,即存在的记录数。因此,例如,如果第一口井从 2018 年 1 月开始到 2018 年 4 月结束,我需要它复制 2018 年 1 月、2018 年 2 月和 2018 年 3 月的行,它甚至可以列出 2018 年 4 月,但停止复制数据中的行,但不要复制该记录已超过其结束日期。完全希望这是有道理的。我可以手动完成,但尝试编写一个存储过程,从原始 table 创建一个新的 table,如下例所示。

起始数据

Well                            Operator                Date_Start  DateEnd     Months
--------------------------------------------------------------------------------------
JIM TOM LONTOS 30 23S 28E RB    MATADOR RESOURCES       1/1/2018    4/2/2018      3
ODIE 1606                       BCE-MACH III LLC        1/1/2018    4/16/2018     3
SIEGRIST 1307                   MARATHON OIL            1/1/2018    5/23/2018     4
SILVERTIP 76-7 UNIT A           OCCIDENTAL PETROLEUM    1/1/2018    12/6/2018    11

结束数据

Date    Lease                           Operator                Start_date  End_Date
--------------------------------------------------------------------------------------
Jan-18  JIM TOM LONTOS 30 23S 28E RB    MATADOR RESOURCES       1/1/2018    4/2/2018
Feb-18  JIM TOM LONTOS 30 23S 28E RB    MATADOR RESOURCES       1/1/2018    4/2/2018
Mar-18  JIM TOM LONTOS 30 23S 28E RB    MATADOR RESOURCES       1/1/2018    4/2/2018
Jan-18  ODIE 1606                       BCE-MACH III LLC        1/1/2018    4/16/2018
Feb-18  ODIE 1606                       BCE-MACH III LLC        1/1/2018    4/16/2018
Mar-18  ODIE 1606                       BCE-MACH III LLC        1/1/2018    4/16/2018
Jan-18  SIEGRIST 1307                   MARATHON OIL            1/1/2018    5/23/2018
Feb-18  SIEGRIST 1307                   MARATHON OIL            1/1/2018    5/23/2018
Mar-18  SIEGRIST 1307                   MARATHON OIL            1/1/2018    5/23/2018
Apr-18  SIEGRIST 1307                   MARATHON OIL            1/1/2018    5/23/2018
Jan-18  SILVERTIP 76-7 UNIT A           OCCIDENTAL PETROLEUM    1/1/2018    12/6/2018
Feb-18  SILVERTIP 76-7 UNIT A           OCCIDENTAL PETROLEUM    1/1/2018    12/6/2018
Mar-18  SILVERTIP 76-7 UNIT A           OCCIDENTAL PETROLEUM    1/1/2018    12/6/2018
Apr-18  SILVERTIP 76-7 UNIT A           OCCIDENTAL PETROLEUM    1/1/2018    12/6/2018
May-18  SILVERTIP 76-7 UNIT A           OCCIDENTAL PETROLEUM    1/1/2018    12/6/2018
Jun-18  SILVERTIP 76-7 UNIT A           OCCIDENTAL PETROLEUM    1/1/2018    12/6/2018
Jul-18  SILVERTIP 76-7 UNIT A           OCCIDENTAL PETROLEUM    1/1/2018    12/6/2018
Aug-18  SILVERTIP 76-7 UNIT A           OCCIDENTAL PETROLEUM    1/1/2018    12/6/2018

一个选项使用递归查询:

with cte as (
    select datefromparts(year(date_start), month(date_start), 1) dt, well, operator, date_start date_end
    from mytable t
    union all 
    select dateadd(month, 1, dt), well, operator, date_start, date_end 
    from cte c 
    where c.dt < end_date
)
select * from cte