【问题标题】:Find next date for certain record in SQL Server 2008在 SQL Server 2008 中查找特定记录的下一个日期
【发布时间】:2011-01-31 15:02:14
【问题描述】:

在 SQL Server 2008 中:

我有两个表,dtlScheme 和 dtlRenewal,具有一对多的关系(一个方案可以有多个续订)。 dtlRenewal 具有唯一的密钥 (dteEffectiveDate, dtlSchemeID)。

现在假设我在 dtlRenewal 中有以下数据:

dtlRenewalID  dtlSchemeID   dteEffectiveDate
1             1             1/1/2005
2             1             1/1/2006
3             1             1/1/2007
4             1             1/1/2008
5             1             1/1/2009

我想为每次续订查找该计划的下一个和上一个生效日期。换句话说,我需要返回这个:

dtlRenewalID  dtlSchemeID   dteEffectiveDate  dtePrevious  dteNext
1             1             1/1/2005          NULL         1/1/2006
2             1             1/1/2006          1/1/2005     1/1/2007
3             1             1/1/2007          1/1/2006     1/1/2008
4             1             1/1/2008          1/1/2007     1/1/2009
5             1             1/1/2009          1/1/2008     NULL

谢谢

卡尔

【问题讨论】:

    标签: sql-server-2008 select date


    【解决方案1】:

    试试这个:

    DECLARE @YourTable table (dtlRenewalID int, dtlSchemeID int, dteEffectiveDate datetime)
    SET NOCOUNT ON
    INSERT @YourTable VALUES (1,1,'1/1/2005')
    INSERT @YourTable VALUES (2,1,'1/1/2006')
    INSERT @YourTable VALUES (3,1,'1/1/2007')
    INSERT @YourTable VALUES (4,1,'1/1/2008')
    INSERT @YourTable VALUES (5,1,'1/1/2009')
    INSERT @YourTable VALUES (6,2,'1/1/2005') --I just repeated the data to make sure 
    INSERT @YourTable VALUES (7,2,'1/1/2006') --it would work with multiple dtlSchemeID
    INSERT @YourTable VALUES (8,2,'1/1/2007') --values, which it does
    INSERT @YourTable VALUES (9,2,'1/1/2008')
    INSERT @YourTable VALUES(10,2,'1/1/2009')
    SET NOCOUNT OFF
    
    
    ;WITH YourTableCTE AS
    (SELECT
        dtlRenewalID, dtlSchemeID, dteEffectiveDate
            ,ROW_NUMBER() OVER(PARTITION by dtlSchemeID order by dtlSchemeID,dtlRenewalID) AS RowNumber
        FROM @YourTable
    )
    SELECT
        c.dtlRenewalID, c.dtlSchemeID, c.dteEffectiveDate, p.dteEffectiveDate AS dtePrevious, n.dteEffectiveDate AS dteNext
        FROM YourTableCTE                 c
            LEFT OUTER JOIN YourTableCTE  p ON c.dtlSchemeID=p.dtlSchemeID AND c.RowNumber-1=p.RowNumber
            LEFT OUTER JOIN YourTableCTE  n ON c.dtlSchemeID=n.dtlSchemeID AND c.RowNumber+1=n.RowNumber
    

    输出:

    dtlRenewalID dtlSchemeID dteEffectiveDate        dtePrevious             dteNext
    ------------ ----------- ----------------------- ----------------------- -----------------------
    1            1           2005-01-01 00:00:00.000 NULL                    2006-01-01 00:00:00.000
    2            1           2006-01-01 00:00:00.000 2005-01-01 00:00:00.000 2007-01-01 00:00:00.000
    3            1           2007-01-01 00:00:00.000 2006-01-01 00:00:00.000 2008-01-01 00:00:00.000
    4            1           2008-01-01 00:00:00.000 2007-01-01 00:00:00.000 2009-01-01 00:00:00.000
    5            1           2009-01-01 00:00:00.000 2008-01-01 00:00:00.000 NULL
    6            2           2005-01-01 00:00:00.000 NULL                    2006-01-01 00:00:00.000
    7            2           2006-01-01 00:00:00.000 2005-01-01 00:00:00.000 2007-01-01 00:00:00.000
    8            2           2007-01-01 00:00:00.000 2006-01-01 00:00:00.000 2008-01-01 00:00:00.000
    9            2           2008-01-01 00:00:00.000 2007-01-01 00:00:00.000 2009-01-01 00:00:00.000
    10           2           2009-01-01 00:00:00.000 2008-01-01 00:00:00.000 NULL
    
    (10 row(s) affected)
    

    【讨论】:

      【解决方案2】:

      以上结果不正确。

      例如 - 上一个日期是 2005-01-01 00:00:00.000 下一个日期是 2007-01-01 00:00:00.000 在上述情况下的下一个日期应该是 2006-01-01 00: 00:00.000。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-17
        • 2014-07-04
        • 2018-06-27
        • 1970-01-01
        • 2015-02-11
        • 2015-10-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多