Announcement

Collapse
No announcement yet.

Fehltage

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Fehltage

    Hallo Zusammen,

    ich habe vereinfacht dargestellt diese Abfrage.

    [highlight=sql]
    select TO_CHAR(T.START_DAT,'iw') WOCHE
    from
    TASK t,
    where TO_CHAR(T.START_DAT,'QYYYY')='42011'
    and TO_CHAR(T.START_DAT,'D') between 1 and 5 group by TO_CHAR(T.START_DAT,'iw')
    having COUNT (distinct(TO_CHAR(T.START_DAT,'D')))<5;

    [/highlight]

    Sinn der Abfrage ist es festzustellen, ob es Werktage gab, an denen bestimmte Jobs nicht liefen.

    Bisher habe ich es ganz einfach gemacht.
    Also wie oben codiert, die Anzahl der Wochentage gezählt und mir die anzeigen lassen, welche weniger als 5 mal liefen.

    Schöner wäre natürlich der genaue Tag.

    Wärte nett, wenn mir einer von Euch einen Tipp geben könnte.

    Viele Grüße und Danke vorab

    Martin

  • #2
    Ich würde einen Rowgenerator alle Tage im fraglichen Zeitraum generieren lassen und dann testen, ob der Job an diesem Tag lief.

    Comment


    • #3
      Wenn du TO_CHAR(T.START_DAT,'D') verwendest muss du noch aufpassen. In abhänigkeit vom NLS_TERRITORY beginnt die Woche an einem anderem Tag.
      Je nach Kalender kann es Samstag, Sonntag oder Montag sein.
      Die Einstellung wird vom Client gemacht, d.h. wenn du sicher gehen möchtest musst du das NLS_TERRITORY abfragen und ggf. ändern.

      Gruss

      Comment


      • #4
        Tja, das ist ein Problem in SQL. Die Arbeit erfolgt mengenbasiert. Du möchtest aber sozusagen ein Un-Menge wissen, Daten die nicht in der DB stehen.
        Du musst also erstmal definieren, welche Menge Dich interessiert wird (alle Arbeitstage). Wenn die nicht in der DB verfügbar ist, bleibt nichts übrig, als sie zu generieren.
        Über einen Rowgenerator, wie schon beschrieben
        Über eine neue Tabelle
        usw.

        Was man nimmt, hängt wahrscheinlich auch davon ab, wie Deine Bestandsmenge ausgeprägt ist.
        Das SQL von Dir sieht so aus, als ob es nur um 1 Datensatz pro Tag geht, sonst würde es glaub ich kein richtiges Ergebnis liefern. Aber vlt vertue ich mich auch.
        Hast Du dazu genauere Angaben?
        Gruß, defo

        Comment


        • #5
          NLS_TERRITORY zeigt (zumindest bei mir) keine Wirkung, wohl aber NLS_LANGUAGE.
          Man kann die NLS-Parameter auch direkt bei TO_CHAR angeben:
          Code:
          --direkte Auswahl
          SELECT TO_CHAR (SYSDATE, 'DAY', 'NLS_DATE_LANGUAGE=GERMAN') de,
                 TO_CHAR (SYSDATE, 'DAY', 'NLS_DATE_LANGUAGE=AMERICAN') am 
            FROM DUAL;
          
          DE         AM       
          ---------- ---------
          MITTWOCH   WEDNESDAY
            
          --NLS_TERRITORY zeigt keine Wirkung
          ALTER SESSION SET NLS_TERRITORY=GERMANY;
          
          Session altered.
          
          SELECT TO_CHAR (SYSDATE, 'DAY') de
            FROM dual;
          
          DE       
          ---------
          WEDNESDAY
          
          ALTER SESSION SET NLS_TERRITORY=AMERICA;
          
          Session altered.
          
          SELECT TO_CHAR (SYSDATE, 'DAY') am
            FROM dual;
            
          AM       
          ---------
          WEDNESDAY
          
          --NLS_LANGUAGE funktioniert hingegen
          ALTER SESSION SET NLS_LANGUAGE=GERMAN;
          
          Session altered.
          
          SELECT TO_CHAR (SYSDATE, 'DAY') de
            FROM dual;
          
          DE        
          ----------
          MITTWOCH  
          
          ALTER SESSION SET NLS_LANGUAGE=AMERICAN;
          
          Session altered.
          
          SELECT TO_CHAR (SYSDATE, 'DAY') am
            FROM dual;  
          
          AM       
          ---------
          WEDNESDAY

          Comment


          • #6
            Originally posted by defo View Post
            Tja, das ist ein Problem in SQL. Die Arbeit erfolgt mengenbasiert. Du möchtest aber sozusagen ein Un-Menge wissen, Daten die nicht in der DB stehen.
            Du musst also erstmal definieren, welche Menge Dich interessiert wird (alle Arbeitstage). Wenn die nicht in der DB verfügbar ist, bleibt nichts übrig, als sie zu generieren.
            Über einen Rowgenerator, wie schon beschrieben
            Über eine neue Tabelle
            usw.

            Was man nimmt, hängt wahrscheinlich auch davon ab, wie Deine Bestandsmenge ausgeprägt ist.
            Das SQL von Dir sieht so aus, als ob es nur um 1 Datensatz pro Tag geht, sonst würde es glaub ich kein richtiges Ergebnis liefern. Aber vlt vertue ich mich auch.
            Hast Du dazu genauere Angaben?
            Hallo,

            die Abfrage ist vereinfacht dargestellt.
            Ich suche aus verschiedenen Protokolltabellen, die Daten die ich benötige.
            O.a. Abfrage dienst nur zur Bestimmung, in welcher ISO-KW der Job nicht 5 mal lief. in der TAsk stehen 10 Jobs und ca. 2000 DS fallen auf den von mir gesuchten.

            Gruß

            MArtin

            Comment


            • #7
              Hallo,

              für Interessierte.

              [highlight=sql]
              select a.* from (
              select datum,iso,to_char(datum,'day') from(
              select
              TO_date(dt,'dd.mm.yy') datum , TO_CHAR( dt+1, 'iw' ) iso
              FROM ( SELECT TRUNC(SYSDATE,'y')-1+ROWNUM dt
              FROM all_objects
              WHERE ROWNUM <= ADD_MONTHS(TRUNC(SYSDATE,'y'),12) -
              TRUNC(sysdate,'y')
              )
              group by TO_DATE(DT,'dd.mm.yy'), TO_CHAR( DT+1, 'iw' ))
              where TO_CHAR(DATUM,'D') <6
              and TO_CHAR(DATUM,'QYY')='411')a
              left join
              (select * from ARI_TM_TASK where and TO_CHAR(START_DAT,'QYYYY')='42011'
              and BEZEICHNUNG='x'
              and TASK_COMMITED='J'
              and TO_CHAR(START_DAT,'D') between 1 and 5)B
              on to_char(b.START_DAT,'dd.mm.yy')=a.DATUM
              where B.START_DAT is null
              and a.DATUM <=TO_CHAR(sysdate,'dd.mm.yy')
              order by a.datum
              ;

              [/highlight]

              gruß

              Martin

              Comment


              • #8
                ah, zu spät.
                Als Ersatz für den Part all_objects.rownum wollte ich noch das hier vorschlagen
                Code:
                select aCounter, RawDate, to_char(RawDate, 'DAY, DD.MM.YYYY') as RawDateLong
                  from (select aCounter,
                                to_date('01.06.2011' /*dateOffset*/, 'DD.MM.YYYY') + aCounter - 1 as RawDate
                           from (select level aCounter from dual connect by level <= 365 /*Range*/)
                       )as SollTermine
                 where to_char(rawdate, 'D') between '1' and '5'
                Geht aber glaub ich erst ab 10, könnte schneller sein, weniger Rechteprobleme.
                Gruß, defo

                Comment


                • #9
                  Originally posted by defo View Post
                  ah, zu spät.
                  Als Ersatz für den Part all_objects.rownum wollte ich noch das hier vorschlagen
                  Code:
                  select aCounter, RawDate, to_char(RawDate, 'DAY, DD.MM.YYYY') as RawDateLong
                    from (select aCounter,
                                  to_date('01.06.2011' /*dateOffset*/, 'DD.MM.YYYY') + aCounter - 1 as RawDate
                             from (select level aCounter from dual connect by level <= 365 /*Range*/)
                         )as SollTermine
                   where to_char(rawdate, 'D') between '1' and '5'
                  Geht aber glaub ich erst ab 10, könnte schneller sein, weniger Rechteprobleme.
                  Hallo Defo,

                  vielen Dank für Deine Mühe!

                  Viele Grüße

                  Martin

                  P.s. Euch anderen natürlich auch

                  Comment


                  • #10
                    Originally posted by jum View Post
                    NLS_TERRITORY zeigt (zumindest bei mir) keine Wirkung, wohl aber NLS_LANGUAGE.
                    Man kann die NLS-Parameter auch direkt bei TO_CHAR angeben:
                    [code]
                    Das meinte ich nicht, sieh' dir mal das an:
                    [highlight=sql]
                    ALTER SESSION SET NLS_TERRITORY=GERMANY;
                    SELECT TO_CHAR (SYSDATE, 'D') TAG FROM DUAL;

                    ALTER SESSION SET NLS_TERRITORY=AMERICA;
                    SELECT TO_CHAR (SYSDATE, 'D') TAG FROM DUAL;

                    ALTER SESSION SET NLS_TERRITORY="UNITED ARAB EMIRATES";
                    SELECT TO_CHAR (SYSDATE, 'D') TAG FROM DUAL;


                    Session altered.

                    TAG
                    ---
                    4
                    1 row selected.
                    Session altered.

                    TAG
                    ---
                    5
                    1 row selected.
                    Session altered.

                    TAG
                    ---
                    6
                    1 row selected.
                    [/highlight]

                    Wenn du "TO_CHAR(START_DAT,'D') BETWEEN 1 AND 5 " verwendest musst du das nls_territoy beachten weil die Funktion unterschiedliche Werte zurück liefern kann.

                    Gruss

                    Comment


                    • #11
                      Das war mir neu - Danke für den Tip!

                      Comment

                      Working...
                      X