2011-06-21 54 views
4

首先,我將這個問題標記爲語言不可知,但我使用的是PHP和MySQL。它不應該很大程度上影響問題本身。如何處理經常性時間?

我正在創建一個應用程序,顯示整個星期內某些節目的時間。每個單獨的節目都是經常性的(以每週爲單位),並且可能有2天播放的節目 - 例如。週日23:30開始,週一00:30結束。我正在存儲節目的開始(星期幾 - 星期一,星期二...... - 從不確切日期;時間)和持續時間。從來沒有表明會花費超過24小時。

我的問題是驗證如果新添加的節目不重疊一些舊的。特別是如果涉及週日到週一的節目。

在數據庫端和服務器端通常如何處理這種循環事件?

TL;博士版本的東西,我認爲

我的第一個想法是創建一些自定義的驗證算法,但它似乎過於繁瑣和複雜。並不是說我會對複雜的手工解決方案抱怨,但是如果沒有更多基本的東西丟失,我很感興趣。

想到的另一個選擇是將表格結構更改爲使用datetime(而不是「星期幾」和「時間」),並使用假的固定日期範圍來存儲數據。例如,所有星期一將設定爲1970年1月5日,星期日將用於1970年1月11日。此規則將有一個例外 - 如果某些節目在星期日開始並在星期一結束,則將存儲爲1月12日這個解決方案將允許數據庫比原來更靈活地查詢數據庫,並且還可以簡化針對每個星期之間重疊的節目的查詢(因爲我們可以直接在查詢中進行比較)。這個解決方案也有一些缺點(例如,使用假日期可能會讓人困惑)。

這兩個解決方案對我來說都是錯誤的算法的味道,並希望聽到更多有經驗的開發人員的意見。

+0

因此,在給定時間只能有一個節目,並且您正試圖驗證是否添加了新節目,是否與任何現有節目沒有交集? – Lester

+0

是的,確切地說。 –

回答

7

聽起來就像您可以將每個節目的起始分鐘存儲爲自本週開始以來的整數分鐘(10,080個可能的值)。

然後表演開始分鐘$a與持續時間$dur_a將重疊$b當且僅當

(10080 + $b - $a) % 10080 < $dur_a

例如,考慮一個節目開始星期天晚上11點,另一個開始十二點半週一。這裏$a == 10020$dur_a == 120$b == 30(10080 + $b - $a) % 10080 == 90。這小於$dur_a,因此節目重疊。

+0

主要問題是節目在週日晚上開始,週一早上結束。你沒有考慮你的例子。 –

+0

爲什麼不呢?如果'$ a == 10020'和'$ dur_a == 120'和'$ b == 30',那麼'(10080 + $ b - $ a)%10080 == 90'。這比'$ dur_a'少,因此節目重疊。 – Tom

+0

對不起,我收回。它像一個魅力! –

1

通過將數據轉換爲適合所需計算的格式,可以簡化此問題。我建議創建一個類型,將開始時間表示爲從週日午夜開始的分鐘數。然後,可以使用簡單的整數範圍比較來查找重疊的節目。

當然,內部表示必須隱藏和抽象。例如,您可能在某些時候想要將表示從幾分鐘改爲秒。

0

我會選擇一個自定義的驗證算法:

  • 對於每個節目,計算所有示出的間隔[start1, end1], [start2, end2], ... [startN, endN],其中N是該節目復發的數量。
  • 對於新演出,也計算這些區間。
  • 現在檢查這些新區間是否有任何舊區間相交。如果一個區間的開始或結束包含在另一個區間中,則是這種情況。