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

SQL Server-获取活动日期期间的正确价格

  •  2
  • mistaq  · 技术社区  · 6 年前

    我有一些活动发生的日期范围是:

    活动发生:

    • ID:1,活动ID:1,开始日期:2018-05-01,结束日期:2018-06-30
    • ID:2,活动ID:2,开始日期:2018-06-01,结束日期:2018-07-31
    • ID:3,活动ID:3,开始日期:2018-07-01,结束日期:2018-08-31

    每个活动都有一个在有效期内适用的价格:

    有效期

    • ID:1,活动ID:1,有效期:2018-01-01,有效期:2018-06-30,价格:50
    • ID:2,活动ID:2,有效期:2018-01-01,有效期:2018-06-30,价格:100
    • ID:3,活动ID:3,有效期:2018-01-01,有效期:2018-06-30,价格:70
    • ID:4,活动ID:1,有效期:2018-07-01,有效期:2018-12-31,价格:55
    • ID:5,活动ID:2,有效期:2018-07-01,有效期:2018-12-31,价格:120
    • ID:6,活动ID:3,有效期:2018-07-01,有效期:2018-12-31,价格:80

    我想把这些活动的发生率和它们的正确率联系起来。所以:

    • activityoccurrence id为1将与effectivePeriod id为1链接,只跨越第一个有效期。
    • ActivityOccurrence ID为2将与有效期ID为2和5链接,因为它跨越两个有效期。
    • ActivityOccurrence ID为3将与有效期ID为6链接,只跨越第二个有效期。

    执行标准 JOIN 获取我不需要的所有3个活动事件的两个有效期。使用 StartDate >= ValidFrom 对于第一次活动发生是正确的,但不是第二次和第三次。使用 StartDate <= ValidTo 表示第一个错误,但第二个和第三个是正确的。切换 StartDate EndDate 还有一些问题。

    sqlfiddle: http://sqlfiddle.com/#!18/576c6/6

    我觉得我遗漏了一些东西,答案很简单,但我不知道是什么。

    1 回复  |  直到 6 年前
        1
  •  2
  •   George Menoutis    6 年前

    SELECT ao.ActivityID, ao.StartDate, ao.EndDate, ep.Price
    FROM ActivityOccurrence ao
    JOIN EffectivePeriod ep ON ao.ActivityID = ep.ActivityID
    AND 
    (
        (ao.StartDate between ep.ValidFrom and ep.ValidTo)
        OR
        (ao.EndDate between ep.ValidFrom and ep.ValidTo)
    )