Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

gelöst: Auswertung eines Datums in Jahre, Monate und Tage

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von ny_unity, 16 Oktober 2013.

  1. ny_unity

    ny_unity Datenbank-Guru

    Hallo und Guten Morgen zusammen,

    ich hab da mal wieder eine Frage :)

    Ich habe ein Feld, welches den Eintritt eines Mitarbeiters wiedergibt. Nun möchte ich in einem View anzeigen, wie lange er dem Betrieb zugehört.

    aktuell habe ich es so:
    Code:
    cast(datediff(year,t2.eintritt1,timestamp ''TODAY'') as numeric) || '' Jahr(e)'' || cast(datediff(month,t2.eintritt1,timestamp ''TODAY'') as numeric) || '' Monat(e)'' || cast(datediff(day,t2.eintritt1,timestamp ''TODAY'') as numeric) || '' Tag(e)''  as BEZH
    (das ist jetzt Firebird SQL, aber wenn ich die Syntax habe, finde ich auch die Firebird dazu :) )

    wiedergegeben wird dadurch dann folgendes:
    2 Jahre 28 Monate und 868 Tage :confused:
    Ich möchte aber 2 jahre 4 Monate und x Tage

    Was mach ich falsch?

    Vielen Dank

    Erik
     
  2. ukulele

    ukulele Datenbank-Guru

    Ich check die Syntax nicht ganz aber du müsstest datepart(yyyy,datediff(t2.eintritt1,timestamp ''TODAY'')) nehmen. Nicht die ganze Differenz einmal in Jahren, einmal in Monaten und einmal in Tagen sondern mit datepart() von der gesamten Differenz jeweils den Anteil nehmen und verketten.
     
  3. ny_unity

    ny_unity Datenbank-Guru

    huhu,

    also wenn ich datepart nehme, was im firebird extract ist, dann haben wir das Problem, das wenn Eintritt 01.11.2012 ist und heute ist der 16.10.2013, das 1 Jahr ausgespuckt wird, ist aber kein Jahr sondern 11 Monate.

    Man kann im Firebird nur komplette Dauer auswerten, leider :(
    Im Moment habe ich bei einem Mitarbeiter: 15 Jahre -1 Monat und -4 Tage => das ergibt ja dann 14 Jahre 10 Monate und 27 Tage. Allerdings fehlt mir die Logik das jetzt umzurechnen :-(
     
    akretschmer gefällt das.
  4. akretschmer

    akretschmer Datenbank-Guru

    Gibt es die age - Funktion?

    Code:
    test=*# select age(to_date('01.11.2012','dd.mm.yyyy'));
          age
    -----------------
    11 mons 15 days
    (1 row)
    
     
  5. ny_unity

    ny_unity Datenbank-Guru

    nee, die gibt es leider nicht :-(
    och menno
     
  6. ukulele

    ukulele Datenbank-Guru

    Jetzt wo ich meine alte Abfrage für unsere Betriebszugehörigkeitsliste sehe verstehe ich deine Kopfschmerzen. Ich poste das mal in seiner ganzen Pracht.
    Code:
    SELECT    p.ANREDE + ' ' +
            p.VORNAME + ( CASE    WHEN    p.RUFNAME IS NOT NULL
                                AND        len(p.RUFNAME) > 0
                                THEN    ' "' + p.RUFNAME + '"'
                                ELSE    ''
                        END ) +
            ' ' + p.NAME AS [Name],
            z.nummer AS [PersNr],
            convert(char(10), z.zeitraum_von, 104) AS [Beginn],
            convert(char(10), z.zeitraum_bis, 104) AS [Ende],
    --------------------------------------------------------------------------------
            (    CASE    WHEN    z.zeitraum_bis IS NOT NULL
                        THEN (    CASE    WHEN    datepart(dd,z.zeitraum_bis) < datepart(dd,z.zeitraum_von)
                                        THEN    ( datediff(mm,z.zeitraum_von,z.zeitraum_bis) - 1 ) / 12
                                        ELSE    datediff(mm,z.zeitraum_von,z.zeitraum_bis) / 12
                                END )
                        ELSE (    CASE    WHEN    datepart(dd,getdate()) < datepart(dd,z.zeitraum_von)
                                        THEN    ( datediff(mm,z.zeitraum_von,getdate()) - 1 ) / 12
                                        ELSE    datediff(mm,z.zeitraum_von,getdate()) / 12
                                END )
                        END ) AS [Jahre],
            (    CASE    WHEN    z.zeitraum_bis IS NOT NULL
                        THEN (    CASE    WHEN    datepart(dd,z.zeitraum_bis) < datepart(dd,z.zeitraum_von)
                                        THEN    datediff(mm,z.zeitraum_von,z.zeitraum_bis) - 1 -
                                                datediff(mm,z.zeitraum_von,z.zeitraum_bis) / 12 * 12
                                        ELSE    datediff(mm,z.zeitraum_von,z.zeitraum_bis) -
                                                datediff(mm,z.zeitraum_von,z.zeitraum_bis) / 12 * 12
                                END )
                        ELSE (    CASE    WHEN    datepart(dd,getdate()) < datepart(dd,z.zeitraum_von)
                                        THEN    datediff(mm,z.zeitraum_von,getdate()) - 1 -
                                                datediff(mm,z.zeitraum_von,getdate()) / 12 * 12
                                        ELSE    datediff(mm,z.zeitraum_von,getdate()) -
                                                datediff(mm,z.zeitraum_von,getdate()) / 12 * 12
                                END )
                        END ) AS [Monate],
            (    CASE    WHEN    z.zeitraum_bis IS NOT NULL
                        THEN (    CASE    WHEN    datepart(dd,z.zeitraum_bis) = datepart(dd,z.zeitraum_von)
                                        THEN    1
                                        ELSE (    CASE    WHEN    datepart(dd,z.zeitraum_bis) > datepart(dd,z.zeitraum_von)
                                                        THEN    datepart(dd,z.zeitraum_bis) - datepart(dd,z.zeitraum_von) + 1
                                                        ELSE    day(dateadd(mm,datediff(mm,-1,z.zeitraum_von),-1)) -
                                                                datepart(dd,z.zeitraum_von) + datepart(dd,z.zeitraum_bis)
                                                END )
                                END )
                        ELSE (    CASE    WHEN    datepart(dd,getdate()) = datepart(dd,z.zeitraum_von)
                                        THEN    1
                                        ELSE (    CASE    WHEN    datepart(dd,getdate()) > datepart(dd,z.zeitraum_von)
                                                        THEN    datepart(dd,getdate()) - datepart(dd,z.zeitraum_von) + 1
                                                        ELSE    day(dateadd(mm,datediff(mm,-1,z.zeitraum_von),-1)) -
                                                                datepart(dd,z.zeitraum_von) + datepart(dd,getdate())
                                                END )
                                END )
                        END ) AS [Tage],
    --------------------------------------------------------------------------------
            convert(char(10), p.GEBURTSDATUM, 104) + (    CASE    WHEN    p.TODESDATUM IS NOT NULL
                                                                THEN    ' ( '+ char(134) + ' ' + convert(char(10), p.TODESDATUM, 104) + ')'
                                                                ELSE    ''
                                                        END ) AS [Geburtsdatum],
    --------------------------------------------------------------------------------
            (    CASE    WHEN    p.TODESDATUM IS NOT NULL
                        THEN (    CASE    WHEN    datepart(dd,p.TODESDATUM) < datepart(dd,p.GEBURTSDATUM)
                                        THEN    ( datediff(mm,p.GEBURTSDATUM,p.TODESDATUM) - 1 ) / 12
                                        ELSE    datediff(mm,p.GEBURTSDATUM,p.TODESDATUM) / 12
                                END )
                        ELSE (    CASE    WHEN    datepart(dd,getdate()) < datepart(dd,p.GEBURTSDATUM)
                                        THEN    ( datediff(mm,p.GEBURTSDATUM,getdate()) - 1 ) / 12
                                        ELSE    datediff(mm,p.GEBURTSDATUM,getdate()) / 12
                                END )
                        END ) AS [Jahre_],
            (    CASE    WHEN    p.TODESDATUM IS NOT NULL
                        THEN (    CASE    WHEN    datepart(dd,p.TODESDATUM) < datepart(dd,p.GEBURTSDATUM)
                                        THEN    datediff(mm,p.GEBURTSDATUM,p.TODESDATUM) - 1 -
                                                datediff(mm,p.GEBURTSDATUM,p.TODESDATUM) / 12 * 12
                                        ELSE    datediff(mm,p.GEBURTSDATUM,p.TODESDATUM) -
                                                datediff(mm,p.GEBURTSDATUM,p.TODESDATUM) / 12 * 12
                                END )
                        ELSE (    CASE    WHEN    datepart(dd,getdate()) < datepart(dd,p.GEBURTSDATUM)
                                        THEN    datediff(mm,p.GEBURTSDATUM,getdate()) - 1 -
                                                datediff(mm,p.GEBURTSDATUM,getdate()) / 12 * 12
                                        ELSE    datediff(mm,p.GEBURTSDATUM,getdate()) -
                                                datediff(mm,p.GEBURTSDATUM,getdate()) / 12 * 12
                                END )
                        END ) AS [Monate_],
            (    CASE    WHEN    p.TODESDATUM IS NOT NULL
                        THEN (    CASE    WHEN    datepart(dd,p.TODESDATUM) = datepart(dd,p.GEBURTSDATUM)
                                        THEN    1
                                        ELSE (    CASE    WHEN    datepart(dd,p.TODESDATUM) > datepart(dd,p.GEBURTSDATUM)
                                                        THEN    datepart(dd,p.TODESDATUM) - datepart(dd,p.GEBURTSDATUM) + 1
                                                        ELSE    day(dateadd(mm,datediff(mm,-1,p.GEBURTSDATUM),-1)) -
                                                                datepart(dd,p.GEBURTSDATUM) + datepart(dd,p.TODESDATUM)
                                                END )
                                END )
                        ELSE (    CASE    WHEN    datepart(dd,getdate()) = datepart(dd,p.GEBURTSDATUM)
                                        THEN    1
                                        ELSE (    CASE    WHEN    datepart(dd,getdate()) > datepart(dd,p.GEBURTSDATUM)
                                                        THEN    datepart(dd,getdate()) - datepart(dd,p.GEBURTSDATUM) + 1
                                                        ELSE    day(dateadd(mm,datediff(mm,-1,p.GEBURTSDATUM),-1)) -
                                                                datepart(dd,p.GEBURTSDATUM) + datepart(dd,getdate())
                                                END )
                                END )
                        END ) AS [Tage_],
    --------------------------------------------------------------------------------
            '' + (    CASE    WHEN    z.abteilung IS NOT NULL
                            AND        len(z.abteilung) > 1
                            THEN    'Abteilung: ' + z.abteilung + ' '
                            ELSE    ''
                    END ) + (
                    CASE    WHEN    z.nperson_bezeichnung2 IS NOT NULL
                            AND        len(z.nperson_bezeichnung2) > 1
                            THEN    'Funktion: ' + z.nperson_bezeichnung2 + ' '
                            ELSE    ''
                    END ) + (
                    CASE    WHEN    z.bemerkung IS NOT NULL
                            AND        len(convert(varchar(255), z.bemerkung)) > 1
                            THEN    'Bemerkung: ' + convert(varchar(255), z.bemerkung) + ' '
                            ELSE    ''
                    END ) AS [Sonstiges]
    FROM    PERSONEN p,
            z_jperson_nperson z
    WHERE    p.ty06_mitarbeiter = 1
    AND        p.SID_PERSONEN = z.nperson_fk
    AND        z.jperson_fk = xxx
    ORDER BY [Jahre] DESC,[Monate] DESC,[Tage] DESC
     
    enseth439, akretschmer und ny_unity gefällt das.
  7. akretschmer

    akretschmer Datenbank-Guru

    Angeber!

    Andreas
     
  8. ny_unity

    ny_unity Datenbank-Guru

    hey super!
    Code:
    datediff(month,iif(t4.TEintritt is null,t2.eintritt1,t4.TEintritt),timestamp ''today'')/12
    ergibt 12,75, das sind ja 12 Jahre, aber der View gibt 13 aus, ich find leider nix zum abrunden :-(
    Habt ihr das im petto? :)
     
  9. ukulele

    ukulele Datenbank-Guru

    ny_unity gefällt das.
  10. ny_unity

    ny_unity Datenbank-Guru

    SELECT ROUND(150.75, 0) ist aber immer noch 151 und nicht und
    SELECT ROUND(150.75, 0,1) geht im Firebird nicht :(

    Was soll /100 *100 bringen? 12,75/100*100 ist doch 12,75 :confused:
     
  11. ny_unity

    ny_unity Datenbank-Guru

    cast(round(datediff(month,iif(t4.TEintritt is null,t2.eintritt1,t4.TEintritt),timestamp ''today'')/12,2)*100 as integer)/100 as Jahr
    so gehts, danke :)
     
  12. ny_unity

    ny_unity Datenbank-Guru

    ich nochmal:
    folgendes Szenario: Eintritt 01.01.2011, heute ist der 16.10.2013
    Code:
     WHEN    datepart(dd,z.zeitraum_bis) < datepart(dd,z.zeitraum_von)
                                        THEN    datediff(mm,z.zeitraum_von,z.zeitraum_bis) - 1 -
                                                datediff(mm,z.zeitraum_von,z.zeitraum_bis) / 12 * 12
                                        ELSE    datediff(mm,z.zeitraum_von,z.zeitraum_bis) -
                                                datediff(mm,z.zeitraum_von,z.zeitraum_bis) / 12 * 12
    Zeitraum bis ist hier das heutige Datum!
    das würde ja bedeuten:
    wenn Tagheute < Tageintritt | also: wenn 16 < 01
    dann MonatsdifferenzEintritt zu MonatsdifferenzHeute - 1 - MonatsdifferenzEintritt zu MonatsdifferenzHeute /12 *12
    ergibt also: 9-1-9/12*12 und das ergibt -1
    und beim sonstpart:
    9-9/12*12 ergibt ja auch 1... fehlt hier was? :-(
     
  13. ukulele

    ukulele Datenbank-Guru

    Code:
    DECLARE    @zeitraum_von DATETIME,
            @zeitraum_bis DATETIME
    
    SET        @zeitraum_von = '2011-01-01 00:00:00.000'
    SET        @zeitraum_bis = cast(convert(CHAR(10), getdate(), 104) AS DATETIME)
    
    SELECT    (    CASE
                WHEN    datepart(dd,@zeitraum_bis) < datepart(dd,@zeitraum_von)    --    16    <    1
                THEN    datediff(mm,@zeitraum_von,@zeitraum_bis) - 1 -            --    33    -    1    -
                        datediff(mm,@zeitraum_von,@zeitraum_bis) / 12 * 12        --    33    /    12    *    12
                ELSE    datediff(mm,@zeitraum_von,@zeitraum_bis) -                --    33    -
                        datediff(mm,@zeitraum_von,@zeitraum_bis) / 12 * 12        --    33    /    12    *    12
                END )
    
    SELECT    33-1-33/12*12 AS [then],
            33-33/12*12 AS [else]
    Bei mir kommt da 9 im Ergebnis raus. Weil es ein Zeitunterschied von 2 Jahren, 9 Monaten und 15 Tagen geben müsste ist 9 irgendwie nicht schlecht :)

    Kann sein das der Code manchmal -1 ausspuckt, ich hab ihn nur debugged wenn ich Fehler in meinen Daten hatte. Da aber Eintrittstage wie 28.02. vermutlich sehr selten sind sind auch diverse mögliche Fehlerquellen gar nicht getestet worden.
     
  14. ny_unity

    ny_unity Datenbank-Guru

    entweder brauch ich feierabend oder ich kann nicht rechnen :(

    33-33/12*12 as Else

    33-33/144
    33-0,23
    32,77
    wie kommt da 9 raus? selbst wenn ich anders rechne, ich komme nicht auf 9^^
    33-33/12*12
    0/12*12 = 0

    oder
    33-2,75*12
    30,25*12
    =363

    :confused: Hilfe^^
     
  15. ukulele

    ukulele Datenbank-Guru

    Du kannst nicht rechnen.

    33/12*12 !!!!==== 33/144 Punkt vor Strich aber dann der Reihe nach

    Desweitern liefert datediff() einen INT zurück (nicht vergessen, ich poste MSSQL Code), Nachkommastellen sind also zu runden [Edit: nicht runden, werden einfach abgeschnitten[/Edit].

    33-33/12*12 =
    33-2*12 =
    33-24 =
    9
     
    ny_unity gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden