[Oracle] Automatische Befüllung bei SELECT

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Oracle] Automatische Befüllung bei SELECT

    Hallo,

    ich habe ein SELECT Statement in Oracle, welches von "Datum Uhrzeit" bis "Datum Uhrzeit" lautet.
    Die Werte werden alle 5min. von meinem PHP Skript in die Datenbank geschrieben.

    Wenn das System aber ausfällt, werden keine Werte in die DB geschrieben. Wenn mein SELECT Statement nun genau diesen Zeitraum abfragt, dann fehlen die Werte, in dem das System ausgefallen ist. Weiß jemand, wie ich die für z.B. 30min. fehlenden Werte (im Beispiel also 6 fehlende Datensätze) mit Nullen zurückerhalte.

    Aktuell sieht es so aus :

    15:30:00
    15:35:00
    15:40:00
    15:45:00
    16:20:00
    16:25:00
    16:30:00

    (also Ausfall von 35min.)

    ich will es aber schon in vollem Umfang zurückerhalten :

    15:30:00
    15:35:00
    15:40:00
    15:45:00
    15:50:00
    15:55:00
    16:00:00
    16:05:00
    16:10:00
    16:15:00
    16:20:00
    16:25:00
    16:30:00




    Ist das im SELECT möglich?

  • #2
    du kannst dir dafür doch schnell eine procedure bauen

    PHP-Code:
    begin
    .....
    end
    Beziehung? Klar habe ich mit Beziehungen zu tun ... ich bin Datenbankprogrammierer :-D

    Kommentar


    • #3
      Hi,

      danke für die Info, aber leider habe ich eben nicht so tiefgehende SQL Kenntnisse, dass ich das auch hinkriegen würde. Hab schon bei Oracle und anderen Webseiten geschaut. Aber für dieses Problem gibt es nirgendwo eine Hilfe...

      Es wäre genial, wenn du mir ein wenig genauer helfen kannst....


      Grüße,

      cma


      Um es vielleicht noch deutlicher zu machen, hier mein aktuelles SQL Statement (aus PHP heraus) :

      PHP-Code:
      list($anzahl_monat$werte_monat) = arr_read("SELECT
                CSN_LOGTIME
            ,   ROUND( AVG( FNN_CPU ), 0 ) CPU_AVG
            ,   ROUND( AVG( FNN_WAITIO ), 0 ) WAITIO_AVG
            ,   ROUND( AVG( FNN_MEMORY ), 0 ) MEM_AVG
            FROM (
                SELECT
                    CASE
                    WHEN TO_CHAR( D.FSM_LOGTIME, 'MI' ) < 30 THEN
                        TO_CHAR( D.FSM_LOGTIME, 'YY-MM-DD HH24' ) || ':00:00'
                    ELSE
                        TO_CHAR( D.FSM_LOGTIME, 'YY-MM-DD HH24' ) || ':30:00'
                    END                     AS  CSN_LOGTIME
                ,   NVL( D.FNN_CPU, 0 )     AS  FNN_CPU
                ,   NVL( D.FNN_WAITIO, 0 )  AS  FNN_WAITIO
                ,   NVL( D.FNN_MEMORY, 0 )  AS  FNN_MEMORY
                FROM T_SYSQUALDATAS   Q
                JOIN T_LOGHEADERS     H  ON  Q.FIP_SYSQUALDATANO = H.FRF_SYSQUALDATANO
                JOIN T_LOGDATAS       D  ON  H.FIP_LOGHEADERNO   = D.FRF_LOGHEADERNO
                WHERE
                    Q.FRF_SYSTEMNO =       '
      $fip_systemno'
                AND D.FSM_LOGTIME  BETWEEN TO_DATE( '
      $start_last_month', 'DD.MM.YYYY HH24:MI:SS' ) AND TO_DATE( '$end_yesterday', 'DD.MM.YYYY HH24:MI:SS' )
                ORDER BY
                    D.FSM_LOGTIME
            )
            GROUP BY
                CSN_LOGTIME"
      ); 

      Ich hab halt leider noch nie mit begin und end gearbeitet... Daher fällt es mir schwer mich da reinzudenken... Besonders, weil ich bei einem Select Statement neue Zeilen erzeugen will... !?!?!? Bitte um Hilfe!
      Zuletzt geändert von callmeagent; 17.11.2005, 18:32.

      Kommentar


      • #4
        hab was für dich

        PHP-Code:

        CREATE TYPE col_date 
        AS TABLE OF date;


        create or replace function getZeitspanne(dtStart in datedtEnde in datenMinuten in number := 5) return col_date pipelined is
          nZeit number 
        := 1/24/60*nMinuten;
          
        i     number := 0;
        begin
          
        if dtEnde <= dtStart then return; end if;
          while 
        dtEnde >= dtStart + (nZeit)  loop
            pipe row 
        (dtStart + (nZeit));
            
        := 1;
          
        end loop;
          return;
        end getZeitspanne;

        select from table (getZeitspanne(to_date('01.01.2005','DD.MM.YYYY'), to_date('02.01.2005','DD.MM.YYYY'), 5)); 
        Beziehung? Klar habe ich mit Beziehungen zu tun ... ich bin Datenbankprogrammierer :-D

        Kommentar


        • #5
          ganz vergessen!

          hier mal die tabelle (die so bei dir aussehen könnte / Hab deinen Code oben mir nicht angeschaut )

          create table test_christian
          (
          eintragen date,
          kommentar varchar2(20)
          )

          jetzt das statement was du benötigst

          PHP-Code:

          select 
            T2
          .column_value
            
          T1.kommentar
          from 
          (
               
          select 
                 trunc
          (eintragen,'HH24') + 1/24/60*trunc(to_char(eintragen,'MI')/5)*5 FuenfMin
                 
          kommentar
               from   
                 test_christian
               where  
                 eintragen between to_date
          ('01.01.2005','DD.MM.YYYY'
                 and 
                 
          to_date('02.01.2005','DD.MM.YYYY')) t1,
               
          table (getZeitspanne(to_date('01.01.2005','DD.MM.YYYY'), to_date('02.01.2005','DD.MM.YYYY'), 5)) T2
          where  
            T2
          .column_value T1.FuenfMin (+)
          order by 1
          Beziehung? Klar habe ich mit Beziehungen zu tun ... ich bin Datenbankprogrammierer :-D

          Kommentar

          Lädt...
          X