2013-03-21 78 views
2

我有一個相當複雜的產品/可用性問題,我無法解決,而且我也沒有在任何地方發現任何類似的問題。SQL查詢:檢索重疊的已存在日期期限

表 「產品」:

- id 
- name 

表 「」:

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

一個產品可以在我的情況下,被關聯到很多,即使在相同的日期範圍(開始/結束)。

實例:一個產品 「

期間1)開始:2013-01-01 || 結束:2013-01-07 || 價格:200

週期2)啓動:2013年1月7日|| 結束:2013-01-14 || 價格:250

週期3)開始:2013年1月7日|| 結束:2013-01-10 || 價格:100 ##包含在期間(2)上述

週期4)開始:2013年1月10日|| 結束:2013-01-14 || 價格:200 ##包含在期間(2)上述

週期5)開始:2013年1月11日|| 結束:2013-01-14 || 價格:150 ##包括在上述期間(2)

我需要做的是檢索給定日期範圍內的所有產品及其價格。

用戶會搜索什麼,我要怎麼獲得:

  • 爲2013-01-01和2013年1月7日之間的產品搜索:它應該返回產品一個和200(第一期)的價格。

  • 2013-01- 和2013年1月7日之間的搜索:它應該收益產品一個,因爲該期限內沒有包含完整(2013-01-01天缺失)。

  • 在2013-01-07和2013-01-14(最複雜的情​​況)之間搜索:它應該返回產品A,「2」可能期限:(2)和(3 + 4)。但是,它不應該返回期間(3 + 5),因爲2013-01-10天有一個「漏洞」。

我也想能夠找回最低價格。在上述第三種情況下,它應該返回250,因爲(2)價格低於(3 + 4)價格。

任何幫助將是非常apreciated。

+0

你是否曾經考慮過兩種以上可能結合的範圍? – 2013-03-21 17:23:15

+0

是的,2013/01/01-2013/01/02 + 2013/01/02-2013/01/03 + 2013/01/03-2013/01/07等應該與2013/01/01- 2013年1月7日 – elwood 2013-03-21 17:45:41

回答

0

這不是一個解決方案,但它太長的評論。

你要求做的事情在SQL中幾乎不可能,在編程語言中非常困難。爲了解決這個問題,你需要在兩個日期之間找到所有可能的「時間」。瓦片是單獨的記錄,瓦片是涵蓋時間段的一組記錄。

問題是有很多不同的可能的解決方案,所有不同的大小。

在支持遞歸的編程語言中,您可能採取動態編程方法。這基本上可以從任何時期開始,然後緩解以解決問題,然後考慮下一個時期(深度優先方法)。這在SQL中很難實現。

也許對問題有其他限制,這會使這個問題變得更加容易處理。或者,也許別人會以不同的方式理解它,並看到一個解決方案(這將是非常有趣的)。然而,我的看法是,除非您可以進一步限制問題,否則這在SQL中不值得。