Announcement

Collapse
No announcement yet.

Datumsdifferenz berechnen

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

  • Datumsdifferenz berechnen

    Hallo an alle,

    ich bin ein relativer newbie wenns um oracle geht. ich kann zwar einige select function (z.B.: distinct) aber was ich nun brauche, dazu hab ich keinen plan. und auch nix brauchbares bei google gefunden.

    also ich habe 2 tabellen in beiden tabellen habe ich einträge die über eine id verbunden sind. es wird auch jedes mal das createdate des eintrags eingetragen DD.MM.YY HH.MM.SS

    nun kann ich mir beide einträge mit einer join funktion holen.

    ich will wissen wie man die zeitdifferenz zwischen die einträgen am besten ermittel kann.

    ich habe eine funktion gefunden die die differenz in monaten ausgibt,diese ist aber eher ungenau da die differenzen im tage bis stunden bereich liegt.

    also danke für eure hilfe und ich hoffe ich habe mein Problem gut beschrieben!


  • #2
    Hallo.

    Um welche Oracle Version geht es ? Derzeit wären 10.x und 11 die aktuelleren.
    Aber http://www.plsql.de kann vielleicht schon weiterhelfen: http://www.muniqsoft.de/tipps/9i/9i_sql.htm -> Neue Interval-Datentypen

    Gruss
    MfG
    Cheat-Sheets for Developers / Programming Quotes

    Comment


    • #3
      hi, es geht um version 10.

      inzwischen habe ich einen brauchbaren sql string erzeugen können, in etwa so.

      Code:
      SELECT TO_DATE(PRODDATE, 'DD.MM.YYYY') PRODDATE,AVG(DATEDIFFSCANPROD) AS DATEDIFF FROM(
          SELECT TAB1.PRODDATE AS PRODDATE,TAB2.SCANDATE,SUM(TAB2.SCANDATE - TAB1.PRODDATE) AS DATEDIFFSCANPROD FROM 
      
              (SELECT TO_DATE(CREATE_DATE, 'DD.MM.YYYY') AS PRODDATE,ID AS PRODID
              FROM PROD_DATE)
              TAB1,
              
              (SELECT  ID AS SCANID, TO_DATE(CREATE_DATE,'DD.MM.YYYY') AS SCANDATE  
              FROM SCAN_DATE) 
              TAB2
              
              WHERE TAB1.PRODID = TAB2.SCANID
              
          GROUP BY TAB1.PRODDATE,TAB2.SCANDATE)
      
      GROUP BY PRODDATE
      Das ist so weit schon mal ganz gut. und schaut für meine verhältnisse richtig aus

      aber nun will ich das auch noch nach monaten haben, also den durchschnitt eines monats, das habe ich bis jetzt noch nicht geschaft.

      hat da jemand eine idee?

      danke für die hilfe!

      Comment


      • #4
        Ein Blick in die Dokumentation

        Hallo bcit6k,

        Datumsarithmetik in Oracle liefert immer einen Wert in Tagen.

        Beispiel
        Code:
        SELECT	round(YE-YS)                 "Tage"
            ,   round((YE-YS)*24)            "Stunden"
            ,   round((YE-YS)*24*60)         "Minuten"
            ,   round((YE-YS)*24*60*60)      "Sekunden"
            ,   round(months_between(YE,YS)) "Monate"
            ,   'Doku lesen'                 "usw."
        
        from(
        	SELECT to_date('01.01.2007 00:00:00','DD.MM.YYYY HH24:MI:SS') YS
            	    ,  to_date('31.12.2007 23:59:59','DD.MM.YYYY HH24:MI:SS') YE
        	from DUAL
        )
        
              Tage    Stunden    Minuten   Sekunden     Monate usw.      
        ---------- ---------- ---------- ---------- ---------- ----------
               365       8760     525600   31535999         12 Doku lesen
        
        1 row selected.
        
        Die Möglichkeiten sind schier unendlich, ein Blick in die Dokumentation lohnt sich immer!

        Siegfried

        Comment


        • #5
          und verstehen . Zwischen '01.01.2007 00:00:00' und '31.12.2007 23:59:59'
          liegen nicht 365 Tage und 8760 h .... sondern 364 und 23h und 59min und 59sek.

          Comment


          • #6
            Originally posted by SiegfriedEhlert View Post
            Tage Stunden Minuten Sekunden Monate usw.
            ---------- ---------- ---------- ---------- ---------- ----------
            365 8760 525600 31535999 12 Doku lesen

            1 row selected.
            Hmm, das ist ja interessant! Rechnet Oracle wirklich 525600 * 60 = 31535999 ?

            Aber offensichtlich habe ich mich auch durch die fälschliche Annahme, dass es sich hier um ein geschlossenes Intervall handelt, in die Irre leiten lassen. Die Rundungsfunktion ist hier ungeschickt gewählt.

            Viele Grüße
            m@rc
            Zuletzt editiert von m@rc; 16.11.2007, 16:10.

            Comment


            • #7
              @uminky
              Verstehen ist tatsächlich wichtig!
              Bei der Antwort handelt es sich um eine Aufzählung der möglichen Umwandlungen.

              Siegfried
              Zuletzt editiert von SiegfriedEhlert; 25.06.2009, 00:12.

              Comment


              • #8
                wie schon m@rc geschrieben hat, ist die round-funktion nicht sinnvoll. Da nun mal nicht 365 Tage ODER 8760 Stunden.... dazwischen liegen, sondern 364 Tage ODER 8759 Stunden... .

                SELECT ye - ys Day_Between
                , ( ye - ys ) - MOD(ye - ys,1) Tage
                , TO_CHAR(TO_DATE('01011900','ddmmyyyy') + MOD(ye - ys,1),'hh24') Stunden
                , TO_CHAR(TO_DATE('01011900','ddmmyyyy') + MOD(ye - ys,1),'mi') Minuten
                , TO_CHAR(TO_DATE('01011900','ddmmyyyy') + MOD(ye - ys,1),'ss') Sekunden
                FROM(
                SELECT TO_DATE('01.01.2007 00:00:00','DD.MM.YYYY HH24:MI:SS') YS
                , TO_DATE('31.12.2007 23:49:59','DD.MM.YYYY HH24:MI:SS') YE
                FROM DUAL
                )
                /

                Comment

                Working...
                X