2012-04-08 60 views
0

我有一種情況,我希望用戶能夠指定時間範圍,其中時間是給定周內存在的相對範圍。因此用戶可以選擇週一下午5點 - 週一凌晨1點。想一想就像「一個人的工作班次是幾點鐘」。存儲一週時間的最佳方法

我的第一反應是我可以存儲「相對」時間。因此,假定星期一從星期一00:00:00開始,星期一中午將顯示爲86400/2 = 。我不太喜歡這種方法,因爲它使處理時區有點困難。

是否有一個「最好」的方式來做到這一點(或只是一個好的)? MySQL是否有某種類型的數據類型專門處理這個問題?

我已經標記了這個「Perl」和「MySQL」,因爲我將在這個應用程序中使用它們,但答案並不一定是它們中的任何一個在技術上。

+0

查詢時,爲什麼不將'Monday 5PM - Tuesday 1 AM'轉換爲'UTC datetime range'? – kev 2012-04-08 01:19:05

+0

我可能會誤解,但是轉換後的UTC日期時間範圍不是絕對日期嗎?我正在尋找一種代表「每週二從1PM - 8PM」的方式,而不是「這個特定的星期二從1PM - 8PM」。 – GoldenNewby 2012-04-08 01:22:39

+0

你問哪種格式是最好的,但你沒有具體說明它將如何使用,所以你沒有提供任何我們可以判斷什麼是最好的信息。什麼樣的查詢將檢查這些數據? – ikegami 2012-04-08 01:44:11

回答

0

最好的答案將取決於你將如何處理下游數據。

但我會建議避免任何黑客,做一個簡單的方法(表語法的Sybase,因爲我的MySQL是生鏽 - 對不起)

CREATE TABLE weekday_ranges (
    start_dow int, -- 0-6 or 1-7 depending on what's easier downstream 
    start_hour int, -- 0-23 
    start_minute int, -- 0-59 
    -- Add seconds/micorseconds as needed 
    end_dow  int, 
    end_hour  int, 
    end_minute int 
) 

另一種方法是存儲從週日的偏移量(單位:秒) 00:00,開始和結束偏移量。這提供了它的好處(例如範圍比較僅僅是<>操作符而不是複雜的表達式)。

+0

我想我更喜歡替代方法,這是我在我的問題中暗示的。我認爲你的解決方案在應用程序級別上工作得很好,但它作爲查詢受到阻礙。 – GoldenNewby 2012-04-08 01:37:40

+0

@GoldenNewby - 它可以作爲查詢使用,但與秒偏移量方法相比,它絕對是更加醜陋的查詢優點。它在哪裏獲勝並不需要計算每週存儲和檢索「星期日00:00」時代# – DVK 2012-04-08 01:43:15

-1

將開始和結束時間存儲在一個字段中(而不是分解成部分)將允許對字段進行索引。否則,沒有太大的區別。 (這涉及到選擇零件是組裝成Perl還是SQL中的一個值)。

確實存在無法解決的時區問題:您無法區分開關期間的第一個凌晨2點和第二個凌晨2點脫離DST。輸入中沒有足夠的信息來處理這些信息。

+0

那麼我對時區問題的思考就是2AM總是指第二個2AM。我可以通過以秒爲單位查看一週的持續時間來確定某個特定星期是否發生時區。 – GoldenNewby 2012-04-08 02:02:37

+0

@GoldenNewby,這並沒有解決任何問題。你仍然沒有辦法引用第一個上午2點。現在,它可能是你永遠不需要的,但你還沒有說太多。 – ikegami 2012-04-08 02:37:17

+0

@GoldenNewby,一個星期的時區變化是否與你的問題無關,所以我不知道你爲什麼提出這個問題。如果你發揮這些作用,你就會讓這個問題變得複雜化。 – ikegami 2012-04-08 02:40:15