Добавьте Datatime и Time вместе и преобразуйте их в текст - PullRequest
1 голос
/ 17 апреля 2020

Мне нужно сложить время работы вместе, и через 10 с лишним часов я понятия не имею, как мне это сделать. Таблицы выглядят так:

adrID    wrk_Start                      wrk_End                         wrk_Pause
10       01-04-2020 10:00:00            01-04-2020 18:00:00             00:00:00
10       03-04-2020 10:00:00            03-04-2020 17:30:00             00:30:00
10       06-04-2020 12:00:00            06-04-2020 14:00:00             00:00:00
10       12-04-2020 09:00:00            12-04-2020 16:50:00             00:30:00

Результат должен быть: 23:30, у меня 5: 00: 27

Код работает, только если я использую небольшие интервалы, такие как 10.04. 2020 - 12.04.2020, и когда я использую большие интервалы или интервалы, которые есть в будущем (сегодня у нас 17.04, и я использую, например, 10.04 - 20.04), не работает.

DECLARE @FromDate DATETIME = '01-04-2020 10:00:00';
DECLARE @ToDate DATETIME = '20-04-2020 17:00:00';
DECLARE @user INT = 10;
select convert(varchar, DATEADD(ss, sum(isnull(datediff(second, wrk_Start, wrk_End), 0)), 0), 108)
                from worktime
                where
                wrk_adrID = @wrk_Name and
                wrk_Start >= @wrk_FromDate and
                wrk_End <= @wrk_ToDate

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Во-первых, не пытайтесь преобразовать значение обратно во время - SQL Сервер не разрешает время, превышающее 24 часа.

Я бы go для десятичных часов. Это будет:

select adrid,
       (sum(datediff(second, wrk_start, wrk_end))-
        sum(datediff(second, '00:00:00', wrk_pause))
       )  / (60.0 * 60) as decimal_hours
from worktime
group by adrid;

Здесь - это дб <> скрипка.

1 голос
/ 17 апреля 2020

Обычно лучше сохранять даты и время в формате mysql, в противном случае он получает гораздо больший код:

Ваш текст необходимо преобразовать в даты, снова получить в секундах и, наконец, вернуться к удобочитаемое время

Сначала идет версия mysql с тегом false, а ниже вы найдете версию SQL SERVER, которая является более сложной

SELECT
     SEC_TO_TIME(SUM(TIMESTAMPDIFF(SECOND,STR_TO_DATE(`wrk_Start`,'%d-%m-%Y %k:%i:%s')
     ,STR_TO_DATE(`wrk_End`,'%d-%m-%Y %k:%i:%s')) 
    - TIME_TO_SEC(`wrk_Pause`)))
FROM
    worktime;

Схема (MySQL v5.7)

CREATE TABLE worktime (
  `wrk_Start` VARCHAR(19),
  `wrk_End` VARCHAR(19),
  `wrk_Pause` Time
);

INSERT INTO worktime
  (`wrk_Start`, `wrk_End`, `wrk_Pause`)
VALUES
  ('01-04-2020 10:00:00', '01-04-2020 18:00:00', '00:00:00'),
  ('03-04-2020 10:00:00', '03-04-2020 17:30:00', '00:30:00'),
  ('06-04-2020 12:00:00', '06-04-2020 14:00:00', '00:00:00'),
  ('12-04-2020 09:00:00', '12-04-2020 16:50:00', '00:30:00');

Запрос № 1

SELECT
     SEC_TO_TIME(SUM(TIMESTAMPDIFF(SECOND,STR_TO_DATE(`wrk_Start`,'%d-%m-%Y %k:%i:%s')
     ,STR_TO_DATE(`wrk_End`,'%d-%m-%Y %k:%i:%s')) 
    - TIME_TO_SEC(`wrk_Pause`)))
FROM
    worktime;

| SEC_TO_TIME(SUM(TIMESTAMPDIFF(SECOND,STR_TO_DATE(`wrk_Start`,'%d-%m-%Y %k:%i:%s')
     ,STR_TO_DATE(`wrk_End`,'%d-%m-%Y %k:%i:%s')) 
    - TIME_TO_SEC(`wrk_Pause`))) |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 24:20:00                                                                                                                                                              |

Просмотр на БД Fiddle

SQL СЕРВЕР

CREATE TABLE worktime (
  wrk_Start nvarchar(19),
  wrk_End nvarchar(19),
  wrk_Pause nvarchar(8)
);

INSERT INTO worktime
  (wrk_Start, wrk_End, wrk_Pause)
VALUES
  ('01-04-2020 10:00:00', '01-04-2020 18:00:00', '00:00:00'),
  ('03-04-2020 10:00:00', '03-04-2020 17:30:00', '00:30:00'),
  ('06-04-2020 12:00:00', '06-04-2020 14:00:00', '00:00:00'),
  ('12-04-2020 09:00:00', '12-04-2020 16:50:00', '00:30:00');
GO
4 rows affected
SELECT
(SUM(DATEDIFF(second,CONVERT(DATETIME,[wrk_Start]),
CONVERT(DATETIME,[wrk_End])) -
DATEDIFF(second,'00:00:00',[wrk_Pause]))) wrktime
FROM
worktime;
GO
| wrktime |
| ------: |
|   87600 |
DECLARE @seconds AS int = 896434;
SELECT CONVERT(varchar, (SUM(DATEDIFF(second,CONVERT(DATETIME,[wrk_Start]),
CONVERT(DATETIME,[wrk_End])) -
DATEDIFF(second,'00:00:00',[wrk_Pause]))) / 86400 ) + ':' + -- Days
CONVERT(varchar, DATEADD(ms, ( (SUM(DATEDIFF(second,CONVERT(DATETIME,[wrk_Start]),
CONVERT(DATETIME,[wrk_End])) -
DATEDIFF(second,'00:00:00',[wrk_Pause]))) % 86400 ) * 1000, 0), 108)
as "orktime"
FROM
worktime;
GO
| orktime    |
| :--------- |
| 1:00:20:00 |

дБ <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...