另一種方法。希望這可以幫助。
SELECT ID,
START_TME,
END_TM,
DIFF_TM
FROM
--Not part of SQL just to simulate the table data
(WITH TMP AS
(SELECT 1 ID,
TO_DATE('06/27/2017 00:00','mm/dd/yyyy hh24:mi') START_TME,
TO_DATE('06/27/2017 08:00','mm/dd/yyyy hh24:mi') END_TM
FROM DUAL
UNION ALL
SELECT 1 ID,
TO_DATE('06/27/2017 10:00','mm/dd/yyyy hh24:mi') START_TME,
TO_DATE('06/27/2017 15:00','mm/dd/yyyy hh24:mi') END_TM
FROM DUAL
UNION ALL
SELECT 1 ID,
TO_DATE('06/27/2017 16:00','mm/dd/yyyy hh24:mi') START_TME,
TO_DATE('06/27/2017 17:00','mm/dd/yyyy hh24:mi') END_TM
FROM DUAL
UNION ALL
SELECT 1 id,
to_date('06/27/2017 17:00','mm/dd/yyyy hh24:mi') start_tme,
TO_DATE('06/27/2017 18:00','mm/dd/yyyy hh24:mi') END_TM
FROM DUAL
)
--SQL start from here
SELECT TMP.*,
LEAD(START_TME) OVER(PARTITION BY ID ORDER BY 1 DESC) next_st_tm,
LEAD(END_TM) OVER(PARTITION BY ID ORDER BY 1 DESC) NEXT_EN_TM,
EXTRACT(HOUR FROM TO_TIMESTAMP(LEAD(START_TME) OVER(PARTITION BY ID ORDER BY 1 DESC),'MM/DD/YYYY HH24:MI'))- EXTRACT(HOUR FROM TO_TIMESTAMP(end_tm,'MM/DD/YYYY HH24:MI')) DIFF_TM
FROM TMP
ORDER BY 1 ,
2
)
WHERE DIFF_TM <> 0;
這兩張表的確切結構是什麼? 「結構」是指列名稱及其數據類型。如果他們與你的問題沒有關係,你可以省略一些專欄。因此,例如:表中有兩列,START_TIME和END_TIME?他們是VARCHAR2(糟糕的選擇!)數據類型,還是他們是DATE(完美!)數據類型?然後:在第二個表格中,爲什麼要讓第一行從00:00到07:59而不是08:00?或者從10:01開始下一個,而不是從10:00開始?這很奇怪,不合邏輯。 – mathguy
編輯爲說所有日期和時間字段都輸入爲DATE。我希望他們在一分鐘之前,以便有人仍然可以在8:00安排預約。我看到它並不是不合邏輯的。如果08:00開放,我爲什麼要在08:00之前使用它?如果這樣可以讓解決方案更簡單,那麼就可以,但我必須在其他地方以某種方式解釋它。 – JDro04
時間是連續的,而不是離散的步驟(如整數1,2,3,4 ...)。如果間隔時間爲00:00至07:59,下一個時間爲08:00至10:00,07:59:30哪裏下降? (8點前30秒)。在幾乎所有情況下,按照時間間隔,匹配一個間隔的結束和下一個間隔的開始會更好。例如:在一個簡單的計算中,您將顯示該空間在一天的開始時間不可用7小時59分鐘。這是錯誤的:它不可用於8小時,而不是7小時59分鐘。 – mathguy