2009-12-09 3 views
0

Эти два TimeSpan хранятся в базе данных с 24-часовым форматом. Нет даты, только TimeSpan.Метод вычитания TimeSpan return negative 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) 

«г = -12: 17: 05

Есть ли способ TimeSpan, чтобы получить это право? Спасибо.

+0

Без даты и при условии, что tsStart и tsEnd могут ссылаться на раз в разные дни, нет способа получить это «правильно». У вас нет способа узнать, сколько дней прошло правильно. На данный момент вы генерируете значения, а не вычисляете их. – jball

+0

Я пишу простое приложение для расчета времени регистрации и регистрации студентов. Он ведет учет времени и тайм-аута определенной даты. Есть еще один столбец, в котором хранится только тип даты. , Итак, в записи у вас есть Date, TimeIn, TimeOut. Да, будет проще, если столбцы TimeIn и TimeOut являются типами DateTime. Но я экспериментирую с типом данных Time (7). –

+3

Время (7) занимает 5 байтов, а smalldatetime - 4 байта. Если вам не нужна точность ниже минуты, smalldatetime потребляет меньше памяти и избавит вас от проблем с длинными временными интервалами. Лично я все равно буду использовать полный DateTime для начала и конца, потому что он более устойчив в долгосрочной перспективе, а от 6 до 8 байтов на запись не является огромным увеличением потребления памяти. – jball

ответ

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

+0

Правда, но нет способа сказать иначе, учитывая ограничения, представленные здесь. –

+0

Это хорошо работает. Большое спасибо. –

0

tsEnd меньше, чем tsStart, поэтому r = tsEnd.Subtract(tsStart) должно приводить к отрицательному числу. Возможно, вы хотите вычесть tsEnd из tsStart r = tsStart.Subtract(tsEnd), или ваши переменные устанавливаются в обратном порядке, какими они должны быть?

В зависимости от ситуации вы можете позвонить по телефону r = r.Duration(), который возвращает абсолютное значение r.

Если вы беспокоитесь о днях упаковки, вам понадобится дата - нет способа узнать, сколько дней прошло от момента времени.

+0

Я пытаюсь рассчитать, сколько времени потрачено. Вы видите, что tStStart произошло сначала в 12:27:30 (pm), tsEnd произошло позже в 00:10:25 (am), что составляет 12 часов. –

1

Если вы используете метод Длительность() на TimeSpan, это будет гарантировать, что ваш результат не будет положительным, независимо от того, в каком порядке вы делаете вычитание в

Например:.

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. –

+0

Это позитивно, но и неправильно. –

+0

* facepalm * Как смущающий ... –

Смежные вопросы