2013-10-11 8 views
6

मैं अपने डेटा को 15 मिनट सेगमेंट (घंटे) में जोड़ना चाहता हूं। ऐसा करने के लिए, मैंने कुछ कोड लिखा है जो 15 मिनट के डेटाटाइम ब्लॉक उत्पन्न करता है।ओरेकल पीएलएसक्यूएल टंकटाइम 15 मिनट ब्लॉक

SELECT 
    TRUNC(SYSDATE,'hh') + 0.25/24 - (ROWNUM) *0.25/ 24 
    AS time_start, 
    ROWNUM, 
    TRUNC(SYSDATE,'hh') + 0.25/24 - (ROWNUM - 1) *0.25/ 24 
    AS time_end 
FROM widsys.consist 
WHERE ROWNUM <3000 
ORDER BY sysdate 

मेरी कोड के साथ समस्या यह है क्योंकि यह एक घंटे काट-छांट का उपयोग करता है, यह केवल यह नवीनतम की शुरुआत से समय टिकटों उत्पन्न होगा है। उदाहरण के लिए, यह 11:49AM अब तो उत्पन्न पहला डाक टिकट 11:00AM.

मैं इसे जरूरत है पिछले 15 मिनट ब्लॉक (11:45AM उपरोक्त उदाहरण से) की शुरुआत से टिकटों उत्पन्न करने के लिए है। क्या कोई मेरी मदद कर सकता हैं?

+0

देखें * सही जवाब * [यहां] (https://forums.oracle.com/thread/1008150?start=0&tstart=0) और उसके अनुसार समायोजित । –

+0

इसका एकमात्र एसक्यूएल, पीएल/एसक्यूएल – ajmalmhd04

उत्तर

7

यह आपको निकटतम तिमाही प्राप्त करेगा।

select sysdate, 
     trunc(sysdate,'mi') -       --truncate to the nearest minute 
     numtodsinterval(        --convert the minutes in number to interval type and subtract. 
         mod(to_char(sysdate,'mi'),15), --find the minutes from the nearest quarter 
         'minute'       
        ) as nearest_quarter 
    from dual; 

आउटपुट:

sysdate        nearest_quarter 
----------------------------------------------------------------- 
October, 11 2013 05:54:24+0000  October, 11 2013 05:45:00+0000 
October, 11 2013 05:22:24+0000  October, 11 2013 05:15:00+0000 

आपके प्रारंभ मूल्य के रूप में इस का प्रयोग करें और फिर इस पर पुनरावृति।

with cte as(
    select trunc(sysdate,'mi') - 
     numtodsinterval(mod(to_char(sysdate,'mi'),15),'minute') as nearest_quarter 
    from dual 
) 
select nearest_quarter - numtodsinterval((level - 1)*15, 'minute'), 
     nearest_quarter - numtodsinterval((level - 2)*15, 'minute') 
from cte 
connect by level <= 10; 

Demo

3
width_bucket साथ

एक और:

SELECT trunc(SYSDATE, 'hh')+ (width_bucket(to_number(to_char(SYSDATE, 'mi')), 0 , 60, 4)-1)*15/(24*60) x 
FROM dual; 
0
select TRUNC(SYSDATE,'HH24') + FLOOR((TRUNC(SYSDATE,'MI') - trunc(sysdate,'HH24'))*1440/:mi)*:mi/1440 FROM DUAL 
+0

कृपया अपने कोड पर कुछ विवरण जोड़ें। – fxm

संबंधित मुद्दे