代码之家  ›  专栏  ›  技术社区  ›  Oleksandr Stefanovskyi Adam

如何在表中填充错过的日期

  •  1
  • Oleksandr Stefanovskyi Adam  · 技术社区  · 8 年前

    任务是填充表中缺少的日期。日期应该在现有的后续日期和以前的日期中间。

    表中数据示例:

    +----------+-------------------------+
    | EntityID |       createdDate       |
    +----------+-------------------------+
    |    23964 | 2010-12-02 01:15:39.417 |
    |    23965 | 2013-01-23 23:55:41.770 |
    |    23966 |                         |
    |    23967 |                         |
    |    23968 |                         |
    |    23969 |                         |
    |    23970 | 2008-12-31 17:03:09.260 |
    |    23971 | 2010-02-18 05:03:17.460 |
    +----------+-------------------------+
    

    要解决此任务,我尝试执行以下查询:

    UPDATE Entity
    SET createdDate = DATEADD(SECOND, 1, (SELECT em.createdDate FROM Entity em WHERE em.EntityID = (EntityID - 1)))
    WHERE createdDate IS NULL;
    

    你知道怎么解决这个问题吗?

    2 回复  |  直到 8 年前
        1
  •  3
  •   James MacGilp    8 年前

    update语句中的子选择需要限定两个entityid,否则它是不明确的。下面的查询将基于最近具有日期的实体更新每个空日期。

        UPDATE Entity
    SET createdDate = DATEADD(SECOND, 
                        (SELECT TOP 1 entity.EntityID - em.EntityID FROM Entity em WHERE em.EntityID < (Entity.EntityID) AND em.createdDate IS NOT NULL ORDER BY EntityID DESC), 
                        (SELECT TOP 1 em.createdDate FROM Entity em WHERE em.EntityID < (Entity.EntityID) AND em.createdDate IS NOT NULL ORDER BY EntityID DESC))
    WHERE createdDate IS NULL;
    
        2
  •  0
  •   Killer Queen    8 年前
    DECLARE @id INT,
    @create_date DATETIME
    
        DECLARE upadte_records CURSOR FOR SELECT EntityID, createdDate from Entity
        OPEN upadte_records
        FETCH NEXT FROM upadte_records INTO @id, @create_date
        WHILE @@fetch_status <> -1
        BEGIN
    
                IF @create_date IS NULL
                BEGIN
    
                    UPDATE Entity
                    SET createdDate = DATEADD(SECOND, 1, (SELECT em.createdDate FROM Entity em WHERE em.EntityID = @id -1))
                    WHERE EntityID = @id
                END
    
    
                FETCH NEXT FROM upadte_records INTO @id, @create_date
        END
        CLOSE upadte_records
        DEALLOCATE upadte_records