2012-02-04 126 views
1

在開放結束日期的情況下比較日期範圍的最有效方法,即可選結束日期?我想比較用戶給出的生效日期和可選結束日期與數據庫中現有的重疊生效日期和可選結束日期。如果它們重疊,我想顯示錯誤消息。生效日期是必需的,結束日期是可選的。Java:帶有開放結束日期的日期範圍檢查

重要:

有效日期和結束日期的情況可以有兩種通用的方式來實現。

1)以結束日期爲DB列 例如,抵押或儲蓄賬戶利率。匯率在特定時間點生效,然後保持有效,直到下一個匯率生效並結束先前匯率的影響。在給定時間點,至少有一個記錄生效。

2)通過在數據庫中沒有結束日期 例如,折扣,促銷,促銷或特別優惠。這些都可以生效,並在某個時間點結束。有可能在給定時間沒有特別優惠或折扣正在運行。

情景1很容易實現。每次插入或編輯記錄時,都必須檢查db中是否存在與生效日期(和時間)完全相同的等效記錄。

情景2可能有兩個更多的口味。

2.1)結束日期始終是必需的。(用戶輸入或默認與9999年) 在這種情況下,如果你發現有任何記錄(START1 < = END1和START2 < = END2),那麼你有重疊。

2.2)在這種情況下,結束日期是可選的,null表示正無窮大。用戶可以輸入結束日期或保留空白。 這可能很難驗證爲更多可能的組合。您可能需要動態生成基於用戶給出結束日期的查詢

if(userEnd != null) { 
    query.append(dbStart<=userEnd) 
} 
query.append(dbEnd is null || dbStart>=userStart && dbEnd>=userStart) 

如果此查詢找到任何結果,那麼您是重疊範圍。如果您有要求自動結束日期以前的記錄,如果上一個記錄的結束日期爲空,則可以再進一步,那麼您可能需要修改上述查詢以通過驗證。

if(userEnd != null) { 
    query.append(dbStart<=userEnd) 
} 
query.append((dbEnd is null && dbStart>=userStart) || (dbStart>=userStart && dbEnd>=userStart)) 

根據其他要求,您可能需要使用deleteDate標記記錄無效。可能的組合可以是

生效日期(必填)|刪除日期(可選)

OR

生效日期(必需)|結束日期(必需或可選)|刪除日期(可選)

+0

您是否試圖查看某個日期是否在給定範圍內(可能是開放式的)或者您是否試圖查看一個範圍是否在另一個範圍內? – 2012-02-04 18:47:54

回答

2

我提出的示意​​性圖像關於參考間隔,這可能是開放式的(梯度),並且一個時間跨度進行比較:

schematic image

  • 5個基本例AE沒有開放的結局。讓我們考慮一下比較不是開始時的開放時間。

讓我們進一步定義,沒有兩個日期完全匹配 - 也許是因爲它們以微秒爲單位進行測量。這並不重要,因爲無論您認爲什麼是有效的假設,您只需從<切換到< =或不是。

從基本情況看,它們總是重疊,除了sample.end是< reference.start或sample.start> ref.end。

誰會想到這很容易?

  • 嗯 - 讓我們看看,如果ref.end是開放的,會發生什麼。案例a不受影響,但案例e也會重疊。

這很簡單,不是嗎?

  • 現在我們變得困難了:如果樣本是開放式的,什麼?案例a現在會重疊,但不會受到影響。

  • 性交經驗:兩個日期都是開放式的:然後發生重疊。

結論:如果有疑問,請做一張圖片。這裏是inkscape。

相關問題