SQL查询:检索重叠的现有日期

时间:2013-03-21 16:49:59

标签: mysql sql

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

表“产品”:

- 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)价格。

任何帮助都会非常苛刻。

1 个答案:

答案 0 :(得分:0)

这不是解决方案,但评论时间太长了。

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

问题是存在许多不同的可能解决方案,所有解决方案都有不同的尺寸。

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

也许这个问题有其他限制因素会使这个问题变得更容易处理。或者,也许其他人会以不同的方式理解它并看到一个解决方案(这将非常有趣)。但我的观点是,除非你能进一步限制问题,否则这在SQL中是不值得做的。