首页 > 解决方案 > 如何通过在接下来的 23 天内将日期列增加 1 天来将值插入下表?

问题描述

我正在使用 SQL Server 2014。我有一个表名T1(摘录如下所示):

Company     ReviewDate    Rank     Type       Reviews
  ...
  A         2020-10-12    8        Hotel      675
  B         2020-10-12    10       Hotel      450 
  C         2020-10-12    21       Hotel       89
  D         2020-10-12    60       Hotel      1200
  A         2020-10-13    5        Hotel      688
  B         2020-10-13    10       Hotel      500 
  C         2020-10-13    21       Hotel       89
  D         2020-10-13    60       Hotel      1200 

我需要使用以下逻辑T1将 period 的表更新为2020-10-132020-11-04要附加到表的所有行都将具有与ReviewDateon相同2020-10-12的值,除了ReviewDate它将增加 1 天直到2020-11-04达到。

因此,这里是决赛桌外观的摘录(仅显示了附加的 ReviewDate 2020-10-13:

    Company     ReviewDate   Rank      Type     Reviews
      ...
      A         2020-10-11    8        Hotel      675
      B         2020-10-11    10       Hotel      450 
      C         2020-10-11    21       Hotel       89
      D         2020-10-11    60       Hotel      1200 
      A         2020-10-12    5        Hotel      688
      B         2020-10-12    10       Hotel      500 
      C         2020-10-12    21       Hotel       89
      D         2020-10-12    60       Hotel      1200
      A         2020-10-13    5        Hotel      688
      B         2020-10-13    10       Hotel      500 
      C         2020-10-13    21       Hotel       89
      D         2020-10-13    60       Hotel      1200 
      ...

注意:该表还包含之前 带有 ReviewDate 的条目,2020-10-12但我只需要将特定时期的值插入到表中,其中的数据与2020-10-12

我怎样才能通过T-SQL查询来做到这一点?

标签: sqlsql-servertsql

解决方案


您需要插入行。一种方法是交叉加入您想要的日期并使用它:

insert into t1 (Company, ReviewDate, Rank, Type, Reviews)
    select t1.Company, v.date, t1.Rank, t1.Type, t1.Reviews
    from t1 cross join
         (values ('2020-10-13'),  ('2020-10-14'), . . .
         ) v(date
    where t1.reviewdate = '2020-10-12';

还有其他方法可以创建日期。一种方法是递归 CTE:

with dates as (
      select convert(date, '2020-10-13') as dte
      union all
      select dateadd(day, 1, dte)
      from dates
      where dte < '2020-11-04'
     )
select . . .
from t1 cross join
     dates d;

推荐阅读