Кажется, что на самом деле ваше понимание времени неверно.Между 19:28:35
и 01:00:00
есть на самом деле 5 часов, 31 минута и 25 секунд.Если мы разберемся с этим, сначала у нас будет 31 минута и 25 секунд до 20:00:00
.Затем у вас есть еще 4 часа до полуночи (00:00:00
), а затем, наконец, еще один час до 01:00:00
, что дает общее время 05:31:25
.
Для ответа на не заданный вопрос, однако:запрос выполняется очень медленно, как я могу улучшить его? "Это потому, что вы используете WHILE
.Вам было бы гораздо лучше использовать решение на основе множеств. Если предположить, значения не могут быть 24 часа или более, тогда вы можете сделать что-то вроде этого:
CREATE TABLE YourTable (ch_in time,
ch_out time,
[hours] time);
INSERT INTO YourTable (ch_in,ch_out)
VALUES('19:28:35','01:00:00'),
('19:15:54','01:00:00'),
('19:30:08','01:00:00');
GO
UPDATE YourTable
SET [hours] = CASE WHEN ch_in > ch_out THEN DATEADD(SECOND, DATEDIFF(SECOND,ch_in, ch_out),CONVERT(time,'00:00:00'))
ELSE DATEADD(SECOND, 86400 - DATEDIFF(SECOND,ch_out, ch_in),CONVERT(time,'00:00:00')) END; --86400 is how many seconds there are in a day
GO
SELECT *
FROM YourTable;
Лично я бы сделал hours
вычисляемый столбец:
ALTER TABLE YourTable DROP COLUMN hours;
GO
ALTER TABLE YourTable ADD [hours] AS CONVERT(time,(CASE WHEN ch_in > ch_out THEN DATEADD(SECOND, DATEDIFF(SECOND,ch_in, ch_out),CONVERT(time,'00:00:00'))
ELSE DATEADD(SECOND, 86400 - DATEDIFF(SECOND,ch_out, ch_in),CONVERT(time,'00:00:00')) END));
SELECT *
FROM YourTable;