在開放結束日期的情況下比較日期範圍的最有效方法,即可選結束日期?我想比較用戶給出的生效日期和可選結束日期與數據庫中現有的重疊生效日期和可選結束日期。如果它們重疊,我想顯示錯誤消息。生效日期是必需的,結束日期是可選的。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
生效日期(必需)|結束日期(必需或可選)|刪除日期(可選)
您是否試圖查看某個日期是否在給定範圍內(可能是開放式的)或者您是否試圖查看一個範圍是否在另一個範圍內? – 2012-02-04 18:47:54