Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- WITH
- daily_updates AS ( --My synthetic 100-record impression of your date table
- SELECT level AS entry_number
- , SYSDATE + level + DBMS_RANDOM.VALUE/2 AS insertion_timestamp
- FROM dual
- CONNECT BY level<100),
- update_times AS ( --Conversion of dates to times-since-midnight
- SELECT NUMTODSINTERVAL(TO_CHAR(insertion_timestamp,'MI'),'MINUTE') --Extract minutes from date/time, and convert to time interval
- + NUMTODSINTERVAL(TO_CHAR(insertion_timestamp,'HH24'),'HOUR') --Extract hours from date/time, and convert to time interval
- AS tsm --Sum of hour and minute components: TSM (Time Since Midnight)
- FROM daily_updates)
- SELECT max(tsm)-min(tsm) AS time_range --The part you're looking for
- , min(tsm) AS earliest_TSM --In case you're curious
- , max(tsm) AS latest_TSM --What the min/max TSMs are
- FROM update_times
- DECLARE
- FUNCTION get_time_span(verbose IN VARCHAR2 DEFAULT NULL)
- RETURN INTERVAL DAY TO SECOND
- IS
- CURSOR date_entries
- IS SELECT insertion_timestamp
- FROM daily_updates; --Your date table here
- min_TSM INTERVAL DAY TO SECOND;
- max_TSM INTERVAL DAY TO SECOND;
- current_TSM INTERVAL DAY TO SECOND;
- BEGIN
- FOR entry IN date_entries LOOP
- current_TSM := NUMTODSINTERVAL(TO_CHAR(entry.insertion_timestamp, 'MI'), 'MINUTE')
- + NUMTODSINTERVAL(TO_CHAR(entry.insertion_timestamp, 'HH24'), 'HOUR');
- IF min_TSM IS NULL OR current_TSM < min_TSM THEN
- min_TSM := current_TSM;
- END IF;
- IF max_TSM IS NULL OR current_TSM > max_TSM THEN
- max_TSM := current_TSM;
- END IF;
- END LOOP;
- RETURN max_TSM - min_TSM;
- END get_time_span;
- BEGIN
- DBMS_OUTPUT.PUT_LINE('The time span is '||get_time_span());
- END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement