2016-07-06 91 views
1

規則篩選日期在同一天

一個小時制的任何記錄應當算作一個兩個隨機日期之間的1小時一班。

數據

ID  DATE 

1  06/07/2017 09:20:35 
2  06/07/2017 10:20:35 
3  06/07/2017 10:25:30 
4  06/07/2017 10:40:35 
5  06/07/2017 10:50:35 
6  06/07/2017 11:25:30 
7  06/07/2017 11:50:20 
8  06/07/2017 15:25:30 
9  06/07/2017 17:25:30 
10  06/07/2017 17:30:30 
11  06/07/2017 17:40:55 

預期結果

count  date 

5   06/07/2017 

爲什麼?根據最低日期,一個小時之後的記錄被計爲1。這樣的事情:

count  range_date 

1   09:20:35 - 10:20:35 
1   10:20:36 - 11:20:36 
1   11:20:37 - 12:20:37 
0   12:20:38 - 13:20:38 
0   13:20:39 - 14:20:39 
0   14:20:40 - 15:20:40 
1   15:20:41 - 16:20:41 
1   17:20:42 - 18:20:42 

任何建議這樣做? 因爲我沒有規定日期(最小/最大)的規則,所以有一種說法。我只知道所有日期都是在同一天。

而且我不想進行N合每小時之間選擇......

+1

不清楚你在計算什麼。在輸入表中,哪些區間至少有一行?此外:您對「time_range」的定義(不清楚爲什麼它被稱爲「** date ** _ range」,因爲所有時間都是在同一日期)沒有意義。一小時的時間間隔應該是從9:20:35到10:20:34,然後從10:20:35到11:20:34等 – mathguy

+0

就是這樣......一個「範圍」(又稱區間)是09:20:35至10:20:35之間另一個:10:20:36至11:20:36。我計算一切之間的最小日期之間的一小時,直到最大的一... –

+0

我認爲您的示例的最後一行必須是18:20:42而不是18:20:41 – Carlo

回答

1

如果我理解正確的話您的問題,這是獲得你正在尋找的結果的查詢:

SELECT 
    TRUNC(dt) AS day, 
    COUNT(DISTINCT TRUNC(dt - 20/(24 * 60) - (35 + TO_NUMBER(TO_CHAR(dt, 'HH24')) - 9)/(24 * 60 * 60), 'HH24')) AS hours 
FROM yourtable 
GROUP BY TRUNC(dt) 
  • TRUNC(dt, 'HH24')截斷日期小時(分和秒 被設置爲0)
  • 我減去起始小時的分鐘和秒來 「轉移」 TRUNC糾正時間
  • TO_NUMBER(TO_CHAR(dt, 'HH24')) - 9)是強制添加一秒鐘的時間每隔一小時
  • 隨着COUNT DISTINCT你 數的不同小時數。
  • 如果初始時間是可變的,(我想)我認爲最簡單的方法是用單獨的查詢留着吧,提取小時,分鐘和秒,並輸入使用它們作爲變量主查詢
+1

這真是太棒了......感謝兄弟!:D –

+1

這看起來正確,但過於複雜。戈登的解決方案更簡單,並且具有同樣的精神。它只需要使用(dt - min_dt)* 3601/86400來解釋每小時的額外秒數,而不是(dt - min_dt)/ 24。 – mathguy

1

您想要計算自每個記錄的最早日期/時間以來的小時數。下面是一個方法:

select trunc(dt), count(distinct trunc((dt - min_dt)/24)) as num_hours 
from (select t.*, min(dt) over (partition by trunc(dt) order by dt) as min_dt 
     from t 
    ) t 
group by trunc(dt); 

該表達(dt - min_dt)/24計算每個日期/時間和以小時較早之間的時間。 count(distinct)計算日期中顯示的不同小時數。

+0

我認爲這個查詢保持所有時間間隔的第二個相同的值,但在這個例子中秒數增加:每個間隔是一個小時很長的一秒鐘 – Carlo

+0

是的....我認爲它不分隔所有的時間間隔... –

+0

它可以很容易地修復。在解決方案(dt - min_dt)乘以1/24從「天」轉換爲「小時」(在Oracle日期/時間算法中,1是一天)。要檢查一小時和一秒的整數倍而不是恰好一小時,(dt - min_dt)應該乘以3601/86400。 (請注意,一小時是3600秒,一天是86400秒。) – mathguy