【问题标题】:Copying data with different dates in SQL Server在 SQL Server 中复制具有不同日期的数据
【发布时间】:2016-11-29 00:16:49
【问题描述】:

我有一个包含 4 列和 8000 行数据的表,其中 datetime 列为 2016-01-05。我想将这 8000 行数据复制到 1 月 1 日至 31 日的所有日子。

意思是,我应该有 8000 * 31 天的数据,即使它是相同的数据。

如何在不使用 Excel 文档的情况下执行此操作。

【问题讨论】:

  • 您可以使用交叉连接来执行此操作。我会使用一个计数表来进行交叉连接。 select * from YourTable cross join TallyTable where TallyTable.Number
  • 谢谢先生,我还能提供什么详细信息。?我已经添加了我的示例数据的截图,请看一下。我的表中有前 3 列和最后一列 DT。 SERV_LOC_NUM 是我 2016-06-01 日期的 8000 条记录。所以现在我需要复制 2016-06-02,2016-06-03 等的第 3 列数据,如何创建增量日期列并复制这些记录。
  • 我会保留计数。它可以做很多事情,并使您的代码更快。 sqlservercentral.com/articles/T-SQL/62867

标签: sql-server datetime sql-server-2012 duplicates


【解决方案1】:

通过创建快速日期序列并将您的表格交叉连接到其中,您可以根据需要更新表格:

CREATE TABLE #t (c1 INT, c2 INT, c3 INT, c4 INT);

INSERT  INTO #t
VALUES  (10, 10, 10, 10),
        (20, 20, 20, 20);

;
WITH    CTE_Dates AS (
    SELECT TOP 31
            DATEADD(DAY, ROW_NUMBER() OVER (ORDER BY ao.object_id) - 1, '2016-01-01') AS Date
    FROM      sys.all_objects AS ao
)
SELECT  #t.c1,
        #t.c2,
        #t.c3,
        #t.c4,
        CTE_Dates.Date
FROM    #t
CROSS JOIN CTE_Dates;

【讨论】:

    【解决方案2】:

    首先,创建一个临时日期表,其中包含 2016 年 1 月每一天的值。

    CREATE TABLE #TEMPDATE (DateCol DATETIME)
    
    DECLARE @DAY INT = 1
    DECLARE @DATE DATE = '2016-01-01'
    WHILE @DAY <= 31
    BEGIN
        INSERT #TEMPDATE
        VALUES (@DATE)
        SET @DAY +=1
        SET @DATE = DATEADD(DD,1,@DATE)
    END
    

    接下来,您可以像其他人所说的那样SELECT 所需的列和CROSS JOIN。应该可以得到两个表之间的笛卡尔积(8000 x 31 行)。

    SELECT c.Column1, c.Column2, c.Column3, t.DateCol
    FROM #TEMPDATE t
    CROSS JOIN YourTableName c
    

    【讨论】:

      猜你喜欢
      • 2022-01-12
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 2021-05-04
      • 1970-01-01
      • 2020-10-14
      • 2020-04-12
      • 2019-02-15
      相关资源
      最近更新 更多