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

ny_unity

Datenbank-Guru
Beiträge
133
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
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.394
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.
 

ny_unity

Datenbank-Guru
Beiträge
133
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

Datenbank-Guru
Beiträge
9.028
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 :-(

Gibt es die age - Funktion?

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

ukulele

Datenbank-Guru
Beiträge
4.394
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
Name PersNr Beginn Ende Jahre Monate Tage Geburtsdatum Jahre_ Monate_ Tage_ Sonstiges
Herr xxx xxx 00xxx 01.09.2006 NULL 7 1 16 31.07.19xx xx 2 16 Abteilung: xxx
 

ny_unity

Datenbank-Guru
Beiträge
133
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? :)
 

ny_unity

Datenbank-Guru
Beiträge
133
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:
 

ny_unity

Datenbank-Guru
Beiträge
133
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 :)
 

ny_unity

Datenbank-Guru
Beiträge
133
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? :-(
 

ukulele

Datenbank-Guru
Beiträge
4.394
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.
 

ny_unity

Datenbank-Guru
Beiträge
133
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^^
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.394
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
 
Oben