2009-12-09 102 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