簡體   English   中英

按表oracle sql的兩列之間的時間差分組

[英]grouping by time difference between two columns of a table oracle sql

[進出時間

28-05-2020 16:55:54 28-05-2020 16:55:54

28-05-2020 17:04:08 28-05-2020 17:04:08

29-05-2020 23:10:46 29-05-2020 23:10:46

01-06-2020 12:52:06 01-06-2020 12:52:06

01-06-2020 12:53:11

01-06-2020 13:00:39 01-06-2020 13:00:39

01-06-2020 13:10:43 01-06-2020 13:10:44

28-05-2020 16:55:54

這如何 oracle sql 表在兩列中顯示一些時間戳。

我想在這兩列中以毫秒為單位取出時間差,然后僅在時間差低於 1000 毫秒且兩列都具有有效時間值的情況下,根據毫秒差異將它們分組為計數。

輸入和輸出計數的毫秒差異

3000 10

20 111

1 1000

10000 3

] 1

不幸的是,Oracle 沒有提供一種從另一個時間戳中減去一個時間戳並以毫秒為單位給出答案的簡單方法。 下面的代碼應該給你想要的; 我已經使用 CTE 將它分成幾個步驟,只是為了更容易理解,但您可能可以簡化它。

WITH T1 AS ( -- CALCULATE TIME IN ms BETWEEN EACH TIMESTAMP
SELECT
    IN_TIME,
    OUT_TIME,
    extract( day from (OUT_TIME - IN_TIME) )*24*60*60*1000 +
    extract( hour from (OUT_TIME - IN_TIME) )*60*60*1000 +
    extract( minute from (OUT_TIME - IN_TIME) )*60*1000 +
    round(extract( second from (OUT_TIME - IN_TIME) )*1000) TOTAL_MS
FROM DATA1
)
,T2 AS ( -- FILTER TO INCLUDE ONLY THOSE RECORDS WITHIN THE REQUIRED DURATION
SELECT
    IN_TIME,
    OUT_TIME,
    TOTAL_MS
FROM T1
WHERE TOTAL_MS > 0 AND TOTAL_MS < 1000
)
SELECT TOTAL_MS, COUNT(1) FROM T2
GROUP BY TOTAL_MS
;

更新 1

實際上,以下工作並且更簡單:

(OUT_TIME - IN_TIME)*24*60*60*1000 AS TOTAL_MS

您還可以使用 WHERE 子句從第一個 SELECT 中排除“無效”記錄:

WHERE OUT_TIME IS NOT NULL AND IN_TIME IS NOT NULL

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM