【问题标题】:Is there any way for finding the Overlapping Time in table Workorder using DB2 SQL?有没有办法使用 DB2 SQL 在表 Workorder 中查找重叠时间?
【发布时间】:2019-07-02 09:06:45
【问题描述】:

我想使用 DB2 SQL 制作一份报告,该报告将显示 5 月 15 日至 17 日之间的持续时间(小时)列表。当前列表如下所示:

click here to view the list

如您所见,从WO-391296(第二行)开始,ACTSTARTACTFINISH 的时间重叠。

我已经尝试过重叠功能。这是我的查询:

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)。

【问题讨论】:

    标签: sql db2 overlap


    【解决方案1】:

    2 个区间重叠,如果:
    start of the 1-st is &lt;= of end of the 2-nd

    start of the 2-nd is &lt;= 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;
    

    【讨论】:

    • 嗨,马克。我只是把它放在 WHERE 子句中,并将你所说的 IF 语句更改为 AND。因为 DB2 不能读取 IF 语句。他们使用 CASE WHEN 而不是 IF。而CASE WHEN只要我知道,都是放在SELECT中的。不是在哪里。我已经尝试了您的建议,但结果仍然没有得到重叠。谢谢顺便说一句:D
    • 您不必在我的帖子中将表达式放在“if”之后,如果您确定,那么结束日期不会小于数据中的开始日期。只需在“if”之前使用第一对不等式即可。
    猜你喜欢
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多