我遇到了一个非常复杂的产品/可用性问题,我无法解决,而且我在任何地方都没有找到任何类似的问题。
表“产品”:
- 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)价格。
任何帮助都会非常苛刻。
答案 0 :(得分:0)
这不是解决方案,但评论时间太长了。
您要求做的事情在SQL中几乎是不可能的,而在编程语言中则非常困难。要解决这个问题,您需要找到两个日期之间所有可能的“倾斜”时间。图块是单个记录,而图块是一组涵盖时间段的记录。
问题是存在许多不同的可能解决方案,所有解决方案都有不同的尺寸。
在支持递归的编程语言中,您可以采用动态编程方法。这基本上从任何时期开始,然后递归解决问题,然后考虑下一个时期(深度优先方法)。这在SQL中实现起来并不容易。
也许这个问题有其他限制因素会使这个问题变得更容易处理。或者,也许其他人会以不同的方式理解它并看到一个解决方案(这将非常有趣)。但我的观点是,除非你能进一步限制问题,否则这在SQL中是不值得做的。