Announcement

Collapse
No announcement yet.

Datumsdifferenz festellen durch Abfrage

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

  • Datumsdifferenz festellen durch Abfrage

    Hallo Leute,
    ich muss herausfinden, wie ich zwei Datum subtrahieren kann. Erste Datum ist aktuelles Datum also SYSDATE. Zweite ist ein Datum, das aus eine Datenbank Tabelle gelesen werden soll.

    Tabelle Name: TDSOS_LOCK
    Feldname : TMST (im Format Bsp. 02.08.2012 10:51:31)

    Diff = SYSDATE - TMST

    Diff muss natürlich im Format DATE sein. DATEDIFF() ist wahrscheinlich mein gesuchten Funktion aber ich arbeite gerade mit Oracle SQL und Toad Tools und dieses Tools gibt folgende Fehlermeldung für DATEDIFF() aus.

    Code:
    ORA-00904: "DATEDIFF": invalid identifier
    Was soll ich tun? Zwei Datum Differenz sollte eigentlich nicht so schwierig sein. oder???

    Gruß
    Basay

  • #2
    Warum muss es denn eine Funktion sein?

    SYSDATE - TMST reicht doch schon. Beispiel: SELECT sysdate - TMST FROM dual;

    Für Konvertierungen stehen Funktionen wie to_date() zur Verfügung.


    kuemmelchen

    Comment


    • #3
      Code:
      SELECT (SYSDATE - t.TMST) AS DIFF FROM DUAL d, TDSOS_AWB_LOCKS t
      gibt folgendes als Ergebnis also DIFF aus...

      1,03489583333333

      wie könnte ich es nach ein "echtes" Datum konvertieren?

      Comment


      • #4
        Das ist kein Datum sondern die Zeitspanne in Tagen. Mit Trunc() kannst du auf volle Tage "Abrunden"

        Comment


        • #5
          Trunc() gibt leider nur Tag Differenz aus. (Bsp: 1 oder 2) Aber ich muss den Differenz als Datum und Zeit Format sowie SYSDATE oder TMST ausgeben lassen

          Comment


          • #6
            Eine Zeitdiferenz ist nun mal kein Datum. Du kannst aber den Wert * 24 nehmen, um die Angabe in Stunden zu erhalten (Faktor 1440 für Minuten)

            Comment


            • #7
              Originally posted by knoxyz
              Hallo beterman, ohne zu wissen welche Datenbank du nutzt, ist es nicht möglich dir den notwendigen Befehl zu nennen. mySQL, Oracle, DB2, MSSQL-Server,... haben alle ihre Eigenheiten.
              Er verwendet Oracle
              ich arbeite gerade mit Oracle SQL

              Comment


              • #8
                Möchtest du die Differenz vom Zeitpunkt "TMST" und dem heutigen Datum mit 00:00 Uhr?
                TO_TIMESTAMP(sysdate, 'dd.mm.yy hh24:mi:ss') - TMST

                Oder die Differenz vom Zeitpunkt "TMST" und dem heutigen Datum mit der aktuellen Uhrzeit?
                SYSTIMESTAMP - TMST
                Und Falk Prüfer sprach: Formatierung von SQL in Beiträgen

                Comment


                • #9
                  Hi Markus
                  vielen dank für deine Unterstützung.
                  ich habe folgende PL SQL Code geschrieben.

                  Code:
                  DECLARE
                  mydate NUMBER;
                  mydaydate NUMBER;
                   
                  BEGIN
                   SELECT (SYSDATE - TMST) into mydate FROM TDSOS_AWB_LOCKS; 
                   
                   mydaydate := mydate * 24;
                   dbms_output.put_line(mydaydate);
                  END;
                  wurde folgende Fehlermeldung ausgegeben.

                  Code:
                  ORA-01422: exact fetch returns more than requested number of rows
                  ORA-06512: at line 6
                  P.S: Ich arbeite wie schon besprochen mit TOAD for Oracle

                  Comment


                  • #10
                    Deine Tabelle TDSOS_AWB_LOCKS enthält mehr als einen Datensatz.
                    SELECT liest zunächst alle Werte und will dann sämtliche Werte gleichzeitig in einer Variablen speichern. Dies führt zu den angegebenen Fehler. Hier muss ein Cursor verwendet werden.


                    DECLARE
                    mydaydate NUMBER;
                    BEGIN
                    FOR zeiger IN (SELECT (SYSDATE - TMST) AS diff FROM TDSOS_AWB_LOCKS) LOOP
                    mydaydate := zeiger.diff * 24;
                    dbms_output.put_line(mydaydate);
                    END LOOP;
                    END;
                    /

                    kuemmelchen
                    Zuletzt editiert von kuemmelchen; 03.08.2012, 14:31.

                    Comment


                    • #11
                      Danke
                      ich habe dein Code folgendes umgeschrieben, damit es in meinem System einwandfrei läuft.

                      Code:
                      DECLARE
                      mydaydate NUMBER;
                      
                      BEGIN
                      for zeiger in (select sysdate-tmst as diff from dual, TDSOS_AWB_LOCKS) loop
                      mydaydate := zeiger.diff;
                      
                      DBMS_OUTPUT.PUT_LINE(mydaydate);
                      end loop;
                      end;
                      Das Code gibt als Ergebnis die folgenden Timestamps aus.

                      1,15561342592592592592592592592592592593
                      1,1553125
                      1,12898148148148148148148148148148148148
                      2,0746412037037037037037037037037037037
                      1,07417824074074074074074074074074074074
                      ,9508217592592592592592592592592592592593

                      Die Frage ist, wie ich diese Zahlen nach Datum bzw. Zeit umwandeln kann. Als Ergebnis möchte ich ein schickes Format haben.
                      Was ich nicht nachvollziehen kann, seit 24 Stunden bin ich auf der Suche nach einem Lösung, wie man bei Oracle SQL zwei Datum subtrahieren kann. Es soll nicht so schwierig sein. oder?

                      Comment


                      • #12
                        Hi beterman,

                        hattest du meinen Kommentar #8 gesehen? (Hatten fast gleichzeitig geschrieben)

                        yxcv
                        Und Falk Prüfer sprach: Formatierung von SQL in Beiträgen

                        Comment


                        • #13
                          Vielleicht so:

                          DECLARE
                          mydaydate NUMBER;
                          tage number;
                          stunden number;
                          minuten number;
                          sekunden number;

                          zeit number;
                          datumstext varchar2(30);
                          datum date;

                          BEGIN
                          FOR zeiger IN (SELECT (SYSDATE - TMST) AS diff FROM TDSOS_AWB_LOCKS) LOOP
                          zeit := zeiger.diff;
                          tage := floor(zeiger.diff);

                          zeit := zeit - floor(zeit);
                          stunden := floor (zeit * 24);

                          zeit := zeit * 24 - floor(zeit * 24);
                          minuten := floor (zeit * 60);

                          zeit := zeit * 60 - floor(zeit * 60);
                          sekunden := floor (zeit * 60);

                          dbms_output.put_line(tage || ' Tage ' || stunden || ' Stunden ' || minuten || ' Minuten ' || sekunden || ' Sekunden');

                          datumstext := tage || ' ' || stunden || ':' || minuten || ':' || sekunden;
                          datum := to_date (datumstext, 'DD HH24:MI:SS');

                          dbms_output.put_line(datumstext);
                          dbms_output.put_line(to_char(datum,'DD HH24:MI:SS'));

                          END LOOP;
                          END;
                          /

                          kuemmelchen

                          Comment


                          • #14
                            Hi...
                            Sorry ich habe dein Kommentar übersehen
                            Es sieht funktioniert aus. Aber ich bin nicht sicher mit dem Ergebnis.
                            Schau mal...

                            Sysdate: 03.08.2012 16:14:21
                            TMST: 02.08.2012 10:51:31

                            Ausgegeben Differenz mit deinem Vorschlag

                            Code:
                            SELECT TO_TIMESTAMP(sysdate, 'dd.mm.yy hh24:mi:ss') - TMST FROM DUAL,TDSOS_AWB_LOCKS
                            +00 13:08:29.000000

                            Etwas stimmt nicht oder?

                            Comment


                            • #15
                              Hi kuemmelchen,
                              das Ergebnis sieht ziemlich gut und korrekt aus !!!
                              Danke

                              Comment

                              Working...
                              X