【问题标题】:Display end date minus one day by comparing next start date for same project通过比较同一项目的下一个开始日期,显示结束日期减去一天
【发布时间】:2015-08-05 06:35:31
【问题描述】:

我在 SQL 中有一个表,我想在其中更新结束日期,该日期应该减去下一行的开始日期的一天。另外条件是该行应该属于同一项目,同一员工具有“相同资源”。

例如,在上表中,第一个记录的项目点火结束日期应该是第二个记录的开始日期减去一天。另一个项目也一样。 我已经为此尝试了自连接,因为我想比较同一张表的两行,但它不适用于我的确切结果:-(

【问题讨论】:

  • 您使用的是哪个版本的 SQL Server?
  • 在 SQL Server 2012+ 中:试试这个ISNULL(DATEADD(DAY, 1, LEAD(EXPECTEDSTARETDATE) OVER (PARTITION BY ProjectName ORDER BY EXPECTEDSTARETDATE), EXPECTEDSTARETDATE) EXPECTEDENDDATE ;)。
  • m 使用 sql server 2012
  • I've answered a similar question a few days ago,对于 sql server 2008。在 2012 年你最好使用Lead

标签: sql-server


【解决方案1】:

我认为你可以像这样使用LEAD 函数:

UPDATE yourTable
SET EXPECTEDENDDATE = ISNULL(DATEADD(DAY, 1, 
    LEAD(EXPECTEDSTARETDATE) OVER (PARTITION BY ProjectName 
                                   ORDER BY EXPECTEDSTARETDATE), EXPECTEDSTARETDATE);

【讨论】:

    【解决方案2】:

    这里我放了我们如何实现它的逻辑,请根据你自定义我希望这对你有帮助

    declare @temp table
    (name nvarchar(44),
    startdate date,
    enddate date
    )
    
    insert into @temp values ('one', '2015-07-01', '2015-07-31')
    insert into @temp values ('one', '2015-01-16', '2015-12-31')
    insert into @temp values ('two', '2015-07-01', '2015-07-31')
    insert into @temp values ('two', '2015-07-01', '2015-11-30')
    
    ;WITH CTE AS (
    SELECT
    rownum = ROW_NUMBER() OVER (ORDER BY p.name),
    p.name,
    p.startdate,
    p.enddate
    FROM @temp p
    )
    
    SELECT CTE.name,
    --CTE.startdate,CTE.enddate,
    --prev.enddate PreviousValue,
    --nex.enddate NextValue,
    DATEDIFF(day,CTE.enddate,nex.enddate) diff
    FROM CTE
    LEFT JOIN CTE prev ON prev.rownum = CTE.rownum - 1
    LEFT JOIN CTE nex ON nex.rownum = CTE.rownum + 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 2014-11-25
      相关资源
      最近更新 更多