2010-04-14 108 views
2

我們有兩個字段fromto(的datetime型),用戶可以在其中存儲的開始時間和出差的結束時間,如「僅日期」的(有時)存儲困境:在日期時間

From: 2010-04-14 09:00 
    To: 2010-04-16 16:30 

因此,行程的時間是2天和7.5小時。

通常,確切時間是事先不知道的,所以用戶輸入的日期無時間:

From: 2010-04-14 
    To: 2010-04-16 

內部,這被存儲爲2010-04-14 00:002010-04-16 00:00,因爲這就是最現代的類庫(例如,.net)和數據庫(例如SQL Server)在將日期時間結構中的「僅限日期」存儲時執行此操作。通常情況下,這是非常合理的。

然而,進入2010-04-16to日期時,用戶顯然並沒有意味着2010-04-16 00:00。相反,用戶的意思是2010-04-16 24:00,即計算行程的持續時間應該輸出3 days,而不是2 days

我可以想到這個問題的一些(或多或少是醜陋的)解決方法(如果用戶沒有輸入時間組件,則在to字段的UI層中添加「23:59」;添加一個特殊的「日期如果時間分量爲「00:00」,則在數據庫中存儲「2010-04-17 00:00」,但向用戶顯示「2010-04-16 24:00」; ... ),都有優點和缺點。由於我認爲這是一個相當普遍的問題,我想知道:

  • 有沒有解決它的「標準」最佳實踐方式?
  • 如果沒有,您是否遇到類似的需求,您是如何解決這個問題的?解決方案的優缺點是什麼?
+0

您是否僅使用這些日期來計算持續時間?如果是這樣,那麼你可以用'duration'替換'to'字段,例如'x小時y分鐘'。 AFAIK數據庫具有用於此目的的區間數據類型。 – Juris 2010-04-14 11:24:04

回答

1

有沒有一種神奇的方式來做到這一點,顯着提高了在'to'字段中存儲23:59(或者你喜歡的任何級別的精度)。

這種類型的需求彈出在美國司法管轄區內使用的保險單管理系統中。通常,開始日期和到期日期必須隨時間記錄,到期日期記錄爲xxxx-xx-xx 23:59。令人遺憾的是,除此之外,沒有什麼神奇的公式可以將時間分量默認爲23:59。

1

海事組織的最佳途徑是使用平臺或類庫,其中具有與「日期和時間」以及主題上的多種變體分開的「日期」概念。 (不要忘記在「from」和「to」之間可能存在日光節約轉換的可能性:)

在Java中,我建議使用Joda Time;在.NET中,我的Noda Time項目有望成爲最好的解決方案。

因此,在這種情況下,您確實需要知道是輸入日期還是午夜 - 它們是根本不同的。如果他們將「from」作爲日期和「to」作爲日期/時間輸入,那麼你會做些什麼,我不確定...可能仍然使用「from」的開始日期和「from」的給定時間「到......」但它有點狡猾。從根本上說,你應該嘗試存儲所有你知道的信息,並且只有你知道的信息 - 所以如果你沒有單獨的類型,存儲一個單獨的「這只是一個日期」字段似乎是合理的。這很醜陋,但那是因爲這個平臺對你的幫助不大。