Есть ли способ найти перекрывающееся время в таблице Workorder с использованием DB2 SQL? - PullRequest
0 голосов
/ 02 июля 2019

Я хочу сделать отчет с использованием DB2 SQL, в котором будет показан список продолжительности (часы) с 15 по 17 мая. Текущий список выглядит так:

нажмите здесь, чтобы посмотреть список

Как видите, из WO-391296 (вторая строка) время перекрытия равно ACTSTART и ACTFINISH.

Я уже пробовал использовать функцию перекрытия. Это мой запрос:

SELECT
    *
FROM
    workorder a,
    workorder b
WHERE
    a.wonum <> b.WONUM
    AND (a.ACTSTART, a.ACTFINISH) OVERLAPS (b.ACTSTART, b.ACTFINISH)
    AND DATE(a.ACTSTART) = '2019-05-15'
    AND DATE(a.ACTFINISH) = '2019-05-17'
    AND a.assetnum = 'A0000004'
    AND DATE(b.ACTSTART) = '2019-05-15'
    AND DATE(b.ACTFINISH) = '2019-05-17'
    AND b.assetnum = 'A0000004' ;

Но это не работает и просто выдает мне сообщение об ошибке .:

Ошибка SQL [42601]: неожиданный токен «OVERLAPS» был обнаружен после «TSTART, a.ACTFINISH)». Ожидаемые токены могут включать: «IN». SQLCODE = -104, SQLSTATE = 42601, DRIVER = 3,64.114

Вот мой фактический полный запрос:

SELECT assetnum, wonum, worktype, actstart, actfinish, 
    (DAY(ACTFINISH-ACTSTART)*24 + HOUR(ACTFINISH-ACTSTART)) + FLOAT(MINUTE(ACTFINISH-ACTSTART))/60 AS wotime 
FROM ( 
    SELECT assetnum, wonum, WORKTYPE, ACTSTART, 
        (CASE WHEN ACTFINISH IS NULL THEN '2019-05-17-24.00.00' ELSE ACTFINISH END) AS ACTFINISH 
    FROM workorder ast 
    WHERE istask=0 AND siteid = 'SBY' AND WORKTYPE = 'CM' AND
        (ast.assetnum = 'A0000004' or 
         assetnum in (select distinct assetnum from asset ast where ast.parent = 'A0000004') or 
         assetnum in (select distinct assetnum from asset ast where ast.parent 
                  in (select distinct assetnum from asset ast where ast.parent = 'A0000004'))) AND 
        ( 
            (status IN ('COMP', 'CONFIRM', 'CLOSE') AND 
            (date(ACTFINISH) BETWEEN '2019-05-15' and '2019-05-17')) OR 
            (status IN ('INPRG', 'COMP', 'CONFIRM', 'CLOSE') AND 
            (date(ACTSTART) <= '2019-05-17' AND (date(ACTFINISH) > '2019-05-17' OR ACTFINISH IS null))) 
        ) 
); 

Фактическая общая продолжительность этого списка составляет 6 часов, что неправильно , потому что я не хочу SUM перекрывающееся время.

Итак, окончательный результат должен составить 3,5 часа (без WO-391296).

1 Ответ

0 голосов
/ 02 июля 2019

2 Интервалы перекрываются, если:
start of the 1-st is <= of end of the 2-nd
и
start of the 2-nd is <= of end of the 1-st

create or replace function overlaps_dates (a_from date, a_to date, b_from date, b_to date)
returns int
deterministic
no external action
contains sql
return case when min(a_from, a_to) <= max(b_from, b_to) and min(b_from, b_to) <= max(a_from, a_to) then 1 else 0 end;
...