2009-12-09 440 views
0

這兩個TimeSpan以24小時格式存儲在數據庫中。沒有日期,只有TimeSpan。TimeSpan減法方法返回負值TImeSpan

Dim r As TimeSpan 
Dim tsStart As TimeSpan 
Dim tsEnd As TimeSpan 

'tsStard is 12:27:30 (pm) this happened first 
'tsEnd is 00:10:25 (am) then this happened later 

'You can't store 24:10:25 in the column type Time(7) 

r = tsEnd.Subtract(tsStart) 

「的R = -12:17:05

是否有時間跨度的方法來得到這個權利?謝謝。

+0

如果沒有日期,並假設tsStart和tsEnd可以在不同日期參考時間,那麼沒有辦法讓它「正確」。你無法知道跨度中有多少天是正確的。此時您正在生成值,而不是計算它們。 – jball 2009-12-09 19:50:23

+0

我正在寫一個簡單的應用程序來計算學生的入住和退房時間。它記錄了特定日期的進入和退出時間。還有另一列只存儲日期類型。 。所以,在記錄中你有Date,TimeIn,TimeOut。是的,如果列TimeIn和TimeOut是DateTime類型,則會更容易。但是,我正在試驗數據類型時間(7)。 – 2009-12-09 19:56:55

+3

時間(7)佔用5個字節,smalldatetime佔用4個字節。如果您在一分鐘以內不需要精確性,smalldatetime消耗較少的存儲空間,並且可以節省長時間段的問題。就我個人而言,我仍然傾向於使用完整的DateTime來開始和結束,因爲它從長期來看更健壯,每個記錄6到8個字節並不是存儲消耗的巨大增加。 – jball 2009-12-09 20:31:32

回答

2

如果您知道tsEnd總是表示比tsStart更晚的時間點,但是您的數據庫不存儲日期,可以通過在結束時小於開始時增加24小時來解決此問題(請原諒C#語法):

if (tsEnd < tsStart) { 
    r = tsEnd.Add(new TimeSpan(24, 0, 0)).Subtract(tsStart); 
} else { 
    r = tsEnd.Subtract(tsStart); 
} 

正如jball在評論中指出的那樣,這假設tsEnd永遠不會晚於一天,儘管我們無法確定其他情況。

+0

這假定tsEnd永遠不會晚於1天。 – jball 2009-12-09 19:44:33

+0

確實如此,但鑑於此處提出的限制,無法另行說明。 – 2009-12-09 19:45:42

+0

這個效果很好。非常感謝。 – 2009-12-09 20:11:06

0

tsEnd小於tsStart,因此r = tsEnd.Subtract(tsStart)應導致負數。也許你想從tsStart r = tsStart.Subtract(tsEnd)減去tsEnd,或者你的變量被設置爲與他們應該的相反?

根據您的情況,您可能需要致電r = r.Duration(),它返回r的絕對值。

如果您擔心打包日期,您需要日期 - 沒有辦法知道僅僅從時間組件開始有多少日子。

+0

我正在計算花了多少時間。你看到tsStart先發生在12:27:30(pm),tsEnd發生在晚上00:10:25(上午),這是12小時不同。 – 2009-12-09 19:39:19

1

如果您使用時間跨度的持續時間()方法,它會保證你的結果是肯定的,不管你做什麼樣的順序在減法

例如:

Dim r As TimeSpan 
Dim tsStart As TimeSpan 
Dim tsEnd As TimeSpan 

'tsStart is 12:27:30 
'tsEnd is 00:10:25 

r = tsEnd.Subtract(tsStart).Duration() 
'r = 12:17:05 
+0

然而,這給出了錯誤的值。 r的正確值是11:42:55,而不是12:17:05。 – 2009-12-09 19:53:40

+0

這是積極的,但也是錯誤的。 – 2009-12-09 19:54:49

+0

* facepalm *多麼尷尬...... – 2009-12-09 20:16:04