【问题标题】:Find overlap time between Start date time and end date time with another table使用另一个表查找开始日期时间和结束日期时间之间的重叠时间
【发布时间】:2019-01-20 01:29:39
【问题描述】:

需要找到重叠时间 - START_DATUM 和 END_DATUM 是日期时间字段,其中包含停机时间的开始或结束日期和时间

在下面的示例中,只有内部停机时间(作为 internalDowntime 提到的字段)可以与其他停机时间(作为 OtherDowntime 提到的字段)重叠。最终目标是找到以分钟为单位的总重叠时间作为另一个字段

感谢有人能帮我解决这个问题

SELECT deck.ID_DECKUNGSBEITRAG,

       (
           SELECT TOP (1)
                  DATEDIFF(MINUTE, lr.START_DATUM, lr.END_DATUM) / 60.0
           FROM dbo.LEITSTAND lr
               INNER JOIN dbo.STILLSTANDSZEIT s
                   ON lr.ID_STILLSTANDSZEIT = s.ID_STILLSTANDSZEIT
               INNER JOIN dbo.PRODUKTIONSANLAGE P
                   ON lr.ID_PRODUKTIONSANLAGE = P.ID_PRODUKTIONSANLAGE
           WHERE lr.PRODUKTION_TYP = 'S'
                 AND s.TYP = 'R'
                 AND lr.ID_PRODUKTIONSANLAGE = l.ID_PRODUKTIONSANLAGE
                 AND lr.START_DATUM < l.START_DATUM
           ORDER BY lr.START_DATUM DESC
       ) setuptime,
       DATEDIFF(MINUTE, l.START_DATUM, l.END_DATUM) / 60.0 runtime,
       (
           SELECT SUM(DATEDIFF(MINUTE, le.START_DATUM, le.END_DATUM) / 60.0)
           FROM dbo.STILLSTANDSZEIT s
               INNER JOIN dbo.LEITSTAND le
                   ON le.ID_STILLSTANDSZEIT = s.ID_STILLSTANDSZEIT
           WHERE s.ID_HERSTELLVORSCHRIFT = hs.ID_HERSTELLVORSCHRIFT
       ) internalDowntime,
       (
           SELECT SUM(DATEDIFF(MINUTE, ZEIT_VON, ZEIT_BIS) / 60.0)
           FROM dbo.PRODUKTIONSANLAGE_AUSFALLZEIT
           WHERE ZEIT_VON >= l.START_DATUM
                 AND ZEIT_VON <= l.END_DATUM
                 AND ID_PRODUKTIONSANLAGE = p.ID_PRODUKTIONSANLAGE
       ) OtherDowntime,
       p.STUNDENSATZ_GRENZKOSTEN
FROM dbo.DECKUNGSBEITRAG deck
    INNER JOIN dbo.HERSTELLVORSCHRIFT hs
        ON deck.CHARGE = hs.CHARGE_NUMMER
    INNER JOIN dbo.LEITSTAND l
        ON l.ID_HERSTELLVORSCHRIFT = hs.ID_HERSTELLVORSCHRIFT
    INNER JOIN dbo.PRODUKTIONSANLAGE p
        ON p.ID_PRODUKTIONSANLAGE = l.ID_PRODUKTIONSANLAGE        
WHERE deck.CHARGE = 'CHG0116112945'
      AND deck.ID_MANDANT = 1

【问题讨论】:

标签: sql-server


【解决方案1】:

寻找时间重叠的算法是:

(StartA <= EndB) and (EndA >= StartB)

正如你所说,你有两张桌子。所以你的查询应该是这样的:

SELECT
*
FROM Table1 T1
INNER JOIN Table2 T2 ON T1.ID = T2.T1_ID 
AND T1.StartA <= T2.EndB
AND T1.EndA >= T2.StartB

【讨论】:

  • 感谢您的回复。当我提供完整的查询时,我期望查询输出中的另一列应该以分钟为单位拉取总重叠时间(无论是内部停机时间还是其他停机时间)。不知道如何实现,对使用光标不感兴趣
  • 它不允许我编辑问题,请看下面,它显示了输入数据
【解决方案2】:

如果有停机时间(内部和其他),生产时间总是包括停机时间,想法是计算准确的生产时间,不包括停机时间。这里的问题是,内部停机时间可能与其他停机时间重叠。

SELECT runtime  ---internalDowntime-OtherDowntime AS productiontime  based on overlapping
FROM
(
    SELECT deck.ID_DECKUNGSBEITRAG, 
           DATEDIFF(MINUTE, l.START_DATUM, l.END_DATUM) / 60.0 runtime, --which includes downtime, 
    (
        SELECT SUM(DATEDIFF(MINUTE, le.START_DATUM, le.END_DATUM) / 60.0)
        FROM dbo.STILLSTANDSZEIT s
             INNER JOIN dbo.LEITSTAND le ON le.ID_STILLSTANDSZEIT = s.ID_STILLSTANDSZEIT
        WHERE s.ID_HERSTELLVORSCHRIFT = hs.ID_HERSTELLVORSCHRIFT
    ) internalDowntime, 
    (
        SELECT SUM(DATEDIFF(MINUTE, ZEIT_VON, ZEIT_BIS) / 60.0)
        FROM dbo.PRODUKTIONSANLAGE_AUSFALLZEIT
        WHERE ZEIT_VON >= l.START_DATUM
              AND ZEIT_VON <= l.END_DATUM
              AND ID_PRODUKTIONSANLAGE = p.ID_PRODUKTIONSANLAGE
    ) OtherDowntime
    FROM dbo.DECKUNGSBEITRAG deck
         INNER JOIN dbo.HERSTELLVORSCHRIFT hs ON deck.CHARGE = hs.CHARGE_NUMMER
         INNER JOIN dbo.LEITSTAND l ON l.ID_HERSTELLVORSCHRIFT = hs.ID_HERSTELLVORSCHRIFT
         INNER JOIN dbo.PRODUKTIONSANLAGE p ON p.ID_PRODUKTIONSANLAGE = l.ID_PRODUKTIONSANLAGE
    WHERE deck.CHARGE = 'CHG0116112945'
          AND deck.ID_MANDANT = 1
) temp;

日期格式为 yyyy-mm-dd hh:mm:ss

Production start and endtime (runtime)

  SELECT DATEDIFF(minute,'2016-12-09 01:00:49.203','2016-12-12 22:30:04.787')/60.0       =  93.500000

Internal Downtime 第一排1小时,第二排5小时,共6小时

Other Downtime

第一行SELECT DATEDIFF(minute,'2016-12-10 06:00:00.000','2016-12-12 06:00:00.000')/60.0 =48.000000 突出显示的包含内部停机时间,但 1 小时除外,因此总共 49 小时

除了最终输出(生产时间)为 93.50 - 6 - 49 = 38.5

【讨论】:

    【解决方案3】:

    这是解决方案,

    ;WITH AllDownTime AS
    (
        /* Overlapping DownTimeInternal DownTimeExternal */ 
        SELECT IIF(i.StartTime < e.StartTime, i.StartTime, e.StartTime) StartTime,
               IIF(i.EndTime < e.EndTime, e.EndTime, i.EndTime) EndTime
          FROM dbo.DownTimeInternal i
         INNER JOIN dbo.DownTimeExternal e
                 ON i.StartTime < e.EndTime AND e.StartTime < i.EndTime  
    UNION ALL
        /* Non overlapping DownTimeInternal */
        SELECT i.StartTime, i.EndTime
          FROM dbo.DownTimeInternal i
          WHERE NOT EXISTS(SELECT * 
                             FROM dbo.DownTimeExternal e
                            WHERE i.StartTime < e.EndTime AND e.StartTime < i.EndTime)
    UNION ALL
        /* Non overlapping DownTimeExternal */
        SELECT e.StartTime, e.EndTime
          FROM dbo.DownTimeExternal e
         WHERE NOT EXISTS(SELECT * 
                            FROM dbo.DownTimeInternal i
                           WHERE e.StartTime < i.EndTime AND i.StartTime < e.EndTime)
    )
    
    SELECT SUM(DATEDIFF(minute,StartTime,EndTime))/60.0 
      FROM AllDownTime
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多