2

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

表“产品”:

- 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 || price : 100 ## 包含在上述期间(2)中

期间 4)开始: 2013-01-10 || 结束: 2013-01-14 || price : 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) 价格。

任何帮助都会非常感激。

4

1 回答 1

0

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

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

问题是有许多不同的可能解决方案,所有的大小都不同。

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

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

于 2013-03-21T17:54:53.780 回答