代码之家  ›  专栏  ›  技术社区  ›  Philip

行之间的日期比较

  •  0
  • Philip  · 技术社区  · 7 年前

    我有以下结果,其中我为ExpectedResult添加了一个额外的列。

    我不知道如何让它工作,在这个类别中,应该将datefrom值与下一个datefrom值进行比较,直到最后一行与dateto值进行比较。dateto也可以为空,在这种情况下,它应该与getDate()进行比较。

    有人对如何实现这一目标有什么想法吗?

    对于第1类,从2019-03-01到2019-03-08进行比较,然后从2019-03-08到2019-03-11进行比较,最后从2019-03-11到2019-03-14进行比较,然后重置为下一类。

    示例数据:

    创建表testdata
    (
    ID,
    类别int
    日期从日期时间开始,
    dateto datetime空,
    预期结果int
    )
    
    插入测试数据
    (
    身份证件,
    类别,
    DateFrom
    DateTo
    预期结果
    )
    选择
    1,
    1,
    “01英里2019”
    “06英里2019”
    七
    联合所有
    选择
    2,
    1,
    “08英里2019”
    “09英里2019”
    三
    联合所有
    选择
    三,
    1,
    “11英里2019”
    “14英里2019”
    三
    联合所有
    选择
    1,
    2,
    “04英里2019”
    “07英里2019”
    四
    联合所有
    选择
    2,
    2,
    “08英里2019”
    “15英里2019”
    十
    联合所有
    选择
    三,
    2,
    “18英里2019”
    “24英里2019”
    六
    
    从测试数据中选择*。
    
    删除表测试数据
    < /代码> 
    
    

    有人对如何实现这一目标有什么想法吗?

    enter image description here

    对于第1类,从2019-03-01到2019-03-08进行比较,然后从2019-03-08到2019-03-11进行比较,最后从2019-03-11到2019-03-14进行比较,然后重置为下一类。

    样本数据:

    Create Table #TestData
    (
        ID int,
        Category int,
        DateFrom datetime,
        DateTo datetime NULL,
        ExpectedResult int
    )
    
    insert into #TestData
    (
        ID,
        Category,
        DateFrom,
        DateTo,
        ExpectedResult
    )
    select
        1,
        1,
        '01 Mar 2019',
        '06 Mar 2019',
        7
    union all
    select
        2,
        1,
        '08 Mar 2019',
        '09 Mar 2019',
        3
    union all
    select
        3,
        1,
        '11 Mar 2019',
        '14 Mar 2019',
        3
    union all
    select
        1,
        2,
        '04 Mar 2019',
        '07 Mar 2019',
        4
    union all
    select
        2,
        2,
        '08 Mar 2019',
        '15 Mar 2019',
        10
    union all
    select
        3,
        2,
        '18 Mar 2019',
        '24 Mar 2019',
        6
    
    select  * from #TestData
    
    drop table #TestData
    
    0 回复  |  直到 7 年前
        1
  •  3
  •   sticky bit    7 年前

    似乎你主要在搜索 lead() 窗口功能。为了 datediff() 以天和 coalesce() 替代 NULL S.

    SELECT id,
           category,
           datefrom,
           dateto,
           expectedresult,
           datediff(day,
                    datefrom,
                    lead(datefrom,
                         1,
                         coalesce(dateto,
                                  getdate())) OVER (PARTITION BY category
                                                    ORDER BY datefrom)) calculatedexpectedresult
           FROM #testdata;
    

    db<>fiddle