【问题标题】:Add a new date row for every day where greater than a date column and less than another date column?为大于日期列且小于另一个日期列的每一天添加一个新的日期行?
【发布时间】:2021-09-18 11:45:06
【问题描述】:

我正在尝试在 SQL Server 表中为两列(开始日期列和结束日期列)之间的每一天添加一个新行。

这是一个示例表。为订单和发货日期之间的每一天添加一个新行,包括开始日期和结束日期。

Name Date of Birth Order Date Shipping Date
John Smith 02-24-2001 01-12-2021 01-15-2021
M Jackson 12-16-1992 03-17-2021 03-20-2021

我理想的输出表应该是这样的。

Name Date of Birth Order Date Shipping Date Dates Range
John Smith 02-24-2001 01-12-2021 01-15-2021 01-12-2021
John Smith 02-24-2001 01-12-2021 01-15-2021 01-13-2021
John Smith 02-24-2001 01-12-2021 01-15-2021 01-14-2021
John Smith 02-24-2001 01-12-2021 01-15-2021 01-15-2021
M Jackson 12-16-1992 03-17-2021 03-20-2021 03-17-2021
M Jackson 12-16-1992 03-17-2021 03-20-2021 03-18-2021
M Jackson 12-16-1992 03-17-2021 03-20-2021 03-19-2021
M Jackson 12-16-1992 03-17-2021 03-20-2021 03-20-2021

请注意,我有数百行要复制,并且日期范围在某些情况下可能是几个月,因此无法一一编码,寻找可以为我完成此操作的序列查询。

【问题讨论】:

  • 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。

标签: sql sql-server tsql datetime dateadd


【解决方案1】:

一种方法是递归 CTE:

with cte as (
      select Name, Date_of_Birth, Order_Date, Shipping_Date, Order_Date as date_range
      from t
      union all
      select Name, Date_of_Birth, Order_Date, Shipping_Date, 
             dateadd(day, 1, date_range)
      from cte
      where date_range < coalesce(shipping_date, convert(date, getdate()))
     )
select *
from cte
option (maxrecursion 0);

【讨论】:

  • 谢谢!如果我在某些情况下的发货日期为 NULL,该怎么办?我需要让它继续添加天行,直到当前日期,这可能吗?
  • @TaifAlshakir 。 . .你应该清楚你的问题中的这些事情。我编辑了答案。
【解决方案2】:

更新为捕获 NULL 发货日期

另一种选择是通过临时计数/数字表。请注意,我将天数设置为 5,000。您可以调整到任何合理的数量

示例

Select A.*
      ,[Date Range] = dateadd(DAY,N,A.[Order Date])
 From  YourTable A
 Join (
        Select Top 5000 N=-1+Row_Number() Over (Order By (Select NULL)) 
         From  master..spt_values n1 ,master..spt_values n2 
      ) B on N<=datediff(DAY,A.[Order Date],coalesce(A.[Shipping Date],getdate()))
 Order By [Date Range] -- optional

结果

我添加了一条 NULL 发货日期记录

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-24
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多