【发布时间】:2019-07-02 09:06:45
【问题描述】:
我想使用 DB2 SQL 制作一份报告,该报告将显示 5 月 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]:在“TSTART, a.ACTFINISH)”之后发现了意外的标记“OVERLAPS”。预期的标记可能包括:“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)。
【问题讨论】: