2011-03-25 67 views
-1

我有一個使用MySQL的Ruby on Rails應用程序,我需要計算一個有開始和結束日期行的表的空閒(可用)時間塊。這需要在一個日期範圍內完成,因此,例如,我需要查看5月1日到5月7日之間的哪些時間是空閒的。我可以查詢具有不可用時間的表並使用它來刪除句點時間爲5月1日至5月7日。數據庫中的時間在一刻鐘內保存爲15分鐘,這意味着所有時間都在00,15,30或45分鐘結束。從來沒有像11:16或10:01那樣的時間,所以不需要四捨五入。如何使用開始和結束時間計算空閒時間塊?

我想過創建一個散列,其時間以15分鐘爲增量進行表示,並將所有值默認爲「可用」(1),然後遍歷行的有序結果集並將散列中的值翻到0表示從數據庫返回的時間。我不確定這是否是這樣做的最有效的方式,我對該方法的內存利用率和計算強度有點擔心。這種計算不會一直髮生,但它需要擴展至一天至少幾百次。看起來我還需要重新處理整個散列,以查找在這之後空閒的時間塊,這看起來效率很低。

有更好的方法來做到這一點的任何想法?

謝謝。

+0

另外,值得注意的是,我不一定需要Ruby或RoR的特定解決方案 - 對於這個問題的任何語言或通用算法方法將不勝感激。 – 2011-03-25 13:28:55

+0

你的問題太含糊。如果您有11:01-11:16的起始端不可用時間,您是否想將其舍入到最接近的15分鐘點,如11:00-11:15,或者您認爲每15分鐘的時間段包括不可用時間不可用,因此整個11:00-11:30變得不可用? – sawa 2011-03-25 16:30:23

回答

3

我已經做了幾種方法。首先,我的假設是你的桌子顯示約會,現在你想得到一個未預訂時間的列表,對吧?

所以,我這樣做的第一種方式就像你的,只是未使用時間的散列。由於每次有人需要知道可用的時間,我都必須重新計算哈希,所以速度很慢並且有限且有點浪費。

接下來的方法是從數據倉庫人員那裏借鑑一個想法。我建立了一個我感興趣的所有時隙的屬性表。如果你建立了這種表格,除了時隙時間之外,你可能想要在那裏放置更多的信息。你還可以包括諸如週末,當天的哪個小時,是否在正常營業時間,是否在度假等等。然後,我必須在我的開始和結束時間之間加入所有插槽,並且我的約會爲空。所以,這是一個LEFT JOIN,類似:

SELECT * 
FROM slots 
WHERE ... 
    LEFT JOIN appointments 
    WHERE appointments.id IS NULL 

,讓我不必每次都重新創建哈希,它的使用數據庫做集合運算,一些數據庫做了優化。另外,如果你讓你的老虎機表有點豐富,你可以開始做各種不同的查詢,不僅關注你可能會在之後的時間段,而且關於往往會被預訂的時間種類,或者傾向於始終可用的種類,或者您可能想要在某一天回答的其他有趣問題。至少,你應該跟蹤那些能夠告訴你一個插槽是否應該被填充或不填充(如工作時間)的字段。

+0

感謝大衛,我非常喜歡數據庫的想法。我有一個皺紋,我沒有在我的問題中提到,可能會使這種方法更加困難,我對你的想法很好奇......你是正確的,我的桌子有約會,我現在想找到未預訂的時間。起皺是一些約會是反覆出現的(在不同的時間表上 - 每天/每週/每月)並且經常性約會在數據庫中只有一行,並具有它們的重複時間表的指示。你認爲將經常性事件推斷爲臨時表並進行連接是值得的嗎? – 2011-03-26 02:13:23

+0

我對定期約會所做的工作是爲他們建立一個永久性結構。這樣我可以有更復雜的重複模式,一系列重複記錄。我從未得到滿意解決的一個問題是推斷這些數據。我想出的最好的辦法是在一小段時間內提取經常性事件,就像你正在考慮的那樣。今天,我想知道這個解決方案。在某種程度上,複雜性表明我們將此視爲倉庫問題,並使用JRuby和mondrian-olap。也許這是復發使事情減慢太多的後備。 – 2011-03-26 16:25:58

0

爲什麼不在行中有一個標誌表明這一點。隨着時間的分配,在適當的範圍內翻轉每個日期/時間的標誌。例如5月2日下午12點到1點,將被標記爲不可用。

然後,查詢標記可用性設置爲true的每一行的日期範圍是一件簡單的事情。

相關問題