Рассчитать смену на ночь и день - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть одна таблица "commute_table", и у меня есть 3 столбца: ch_in введите PM, ch_out out AM, часы:

ch_in       ch_out       hours
19:28:35    01:00:00     05:32:00
19:15:54    01:00:00     05:45:00
19:30:08    01:00:00     05:30:00

, и общее количество часов является неправильным результатом смены ночи на утро, что япытался сделать это запрос:

declare @stdt as datetime ,@enddt as datetime , @id INT ,@Timediff int ,@ch_num INT;
SET @id=1;
SET @ch_num=(SELECT count(*) FROM commute_table )
WHILE (@id <=@ch_num)

BEGIN

  SET @stdt=(SELECT log.ch_in from commute_table log where log.Cou=@id  )

    SET @enddt=(SELECT log.ch_out from commute_table log where log.Cou=@id )

 select @Timediff=datediff(mi,@stdt,@enddt)

update  commute_table  set  hours=(select   CONVERT(CHAR(8), DATEADD(MINUTE, @Timediff % 1440, '00:00'), 108)AS Timediff) where Cou=@id

 SET @id=@id+1  
    END 

Так, как лучше всего рассчитать этот сдвиг и пост?Или что не так в моем запросе?

Запрос правильный, я пропустил расчет.

1 Ответ

1 голос
/ 28 сентября 2019

Кажется, что на самом деле ваше понимание времени неверно.Между 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...