【发布时间】:2020-08-18 12:56:19
【问题描述】:
我有一个包含某些进程的开始和结束时间的表格,还有一个包含休息时间的开始和结束时间的表格。我想为每个进程生成一个包含单个条目的新视图,没有中断。我将尝试用一个例子来解释:
表一:
Process | START | STOP
Process xy | 2020-08-18 08:00:00 | 2020-08-18 10:00:00
表二:
| pause_START | pause_STOP
Break 1 | 2020-08-18 08:20:00 | 2020-08-18 08:40:00
Break 2 | 2020-08-18 09:20:00 | 2020-08-18 09:40:00
期望的输出:
Process | START | STOP
Process xy | 2020-08-18 08:00:00 | 2020-08-18 08:20:00
Process xy | 2020-08-18 08:40:00 | 2020-08-18 09:20:00
Process xy | 2020-08-18 09:40:00 | 2020-08-18 10:00:00
或视觉上:
如果每个条目使用选择和联合的组合最多有 一个 中断,我设法做到了,但如果每个进程有多个中断,这将不起作用。
首先我这样创建View1:
SELECT TOP (100) PERCENT dbo.Table1.Process, dbo.Table1.START, dbo.Table1.STOP FROM dbo.Table1 LEFT OUTER JOIN dbo.Table2 ON dbo.Table1.START <= dbo.Table2.pause_START AND (dbo.Table1.STOP >= dbo.Table2.pause_START OR dbo.Table1.STOP IS NULL) AND ((dbo.Table1.STOP >= dbo.Table2.pause_STOP OR dbo.Table1.STOP IS NULL) AND dbo.Table1.START <= dbo.Table2.pause_STOP OR dbo.Table2.pause_STOP IS NULL) WHERE (dbo.Table1.START > CAST(DATEADD(DAY, - 1, GETDATE()) AS DATE)) OR (dbo.Table1.STOP IS NOT NULL)
然后我得到这样的间隔:
SELECT dbo.View1.Process, dbo.View1.START AS 'start', View1_1.pause_START AS 'stop', dbo.View1.TAB, dbo.View1.MA_ID FROM dbo.View1 INNER JOIN dbo.View1 AS View1_1 ON dbo.View1.Process = View1_1.Process AND dbo.View1.TAB = View1_1.TAB WHERE (View1_1.pause_START IS NOT NULL) UNION SELECT dbo.View1.Process, dbo.View1.pause_STOP, View1_1.STOP, dbo.View1.TAB, dbo.View1.MA_ID FROM dbo.View1 INNER JOIN dbo.View1 AS View1_1 ON dbo.View1.Process = View1_1.Process AND dbo.View1.TAB = View1_1.TAB WHERE (View1_1.pause_START IS NOT NULL) UNION SELECT dbo.View1.Process, dbo.View1.START, View1_1.STOP, dbo.View1.TAB, dbo.View1.MA_ID FROM dbo.View1 INNER JOIN dbo.View1 AS View1_1 ON dbo.View1.Process = View1_1.Process AND dbo.View1.TAB = View1_1.TAB WHERE (View1_1.pause_START IS NULL)
但正如我所提到的,这对于每个间隔的休息时间不超过一次。
任何帮助将不胜感激!
【问题讨论】:
-
我有点困惑。第一个表是否有不止一行?中断是特定于进程的吗?
-
嗨,戈登,是的,表 1 不止一行,这只是一个例子 :) 中断是特定于进程的(从没有中断的意义上说 outisde进程的
标签: sql sql-server datetime