【问题标题】:SQL query: retrieve existing dates period with overlapSQL 查询:检索具有重叠的现有日期期间
【发布时间】:2013-03-21 16:49:58
【问题描述】:

我遇到了一个非常复杂的产品/可用性问题,我无法解决,而且我在任何地方都没有找到任何类似的问题。

表格“产品”:

- id
- name

表格“期间”:

- id
- start (Date)
- end (Date)
- price (int)
- product_id

在我的例子中,一个产品可以与许多时期相关联,即使在相同的日期范围内(开始/结束)。

示例:产品“A

期间 1) 开始:2013-01-01 || 结束:2013-01-07 || 价格:200

第 2 期)开始:2013-01-07 || 结束:2013-01-14 || 价格:250

第 3 期)开始:2013-01-07 || 结束:2013-01-10 || 价格: 100 ## 包含在上述期间 (2) 中

第 4 期)开始:2013-01-10 || 结束:2013-01-14 || 价格: 200 ## 包含在上述第 (2) 段中

第 5 期)开始:2013-01-11 || 结束:2013-01-14 || 价格: 150 ## 包含在上述期间 (2) 中

我需要做的是检索给定日期范围内的所有产品及其价格。

用户会搜索什么,以及我想要获得什么:

  • 搜索 2013-01-01 和 2013-01-07 之间的产品:它应该返回产品 A 和 200 的价格(周期 1)。

    李>
  • 在 2013-01-02 和 2013-01-07 之间搜索:它应该返回产品 A,因为期间未完全包括(缺少 2013-01-01 日)。

  • 在 2013-01-07 和 2013-01-14 之间搜索(最复杂的情​​况):它应该返回产品 A,有“两个”可能的周期:(2) 和 ( 3 + 4)。但它不应该返回周期 (3+5),因为 2013-01-10 天有一个“洞”。

我还希望能够检索到最低价格。在上面的第三种情况下,它应该返回 250,因为 (2) 价格低于 (3+4) 价格。

任何帮助将不胜感激。

【问题讨论】:

  • 您是否曾经考虑过可能合并的两个以上范围?
  • 是的,类似 2013/01/01-2013/01/02 + 2013/01/02-2013/01/03 + 2013/01/03-2013/01/07 应该匹配搜索2013/01/01-2013-01-07

标签: mysql sql


【解决方案1】:

这不是一个解决方案,但评论太长了。

您要求做的事情在 SQL 中几乎是不可能的,而在编程语言中则非常困难。为了解决这个问题,您需要找到两个日期之间所有可能的时间“平铺”。平铺是单个记录,平铺是涵盖时间段的一组记录。

问题在于有许多不同的可能解决方案,而且大小都不同。

在支持递归的编程语言中,您可能会采用动态编程方法。这基本上将从任何时期开始,然后递归解决问题,然后考虑下一个时期(深度优先方法)。这在 SQL 中并不容易实现。

也许对这个问题有额外的限制,这会使这个问题更容易处理。或者,也许其他人会以不同的方式理解它并看到解决方案(这将非常有趣)。不过,我的观点是,这在 SQL 中不值得这样做,除非您可以进一步限制问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-08
    • 2021-07-16
    • 2014-02-05
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    相关资源
    最近更新 更多