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

Puh, alles klar, der Fehler war, das ich mit 2,75 statt 2 gerechnet habe...
Ich setzt das ganze Morgen in klammern was gerechnet werden muss und nutze wieder die /100*100 Prinzip, ging ja bei Jahr auch.

Danke erstmal...

Punktrechnung vor strichrechnung ist mir n begriff, allerdings habe ich immer erst 12*12 gerechnet und wie gesagt mit 2,75 statt 2.

Danke und schönen Feierabend
 
Werbung:
Wenn du 2,75 * 100 / 100 rechnest wird auch wieder 2,75 raus kommen solange du nicht explizit nach INT oder SMALLINT konvertierst oder deine DB bereits damit arbeitet. Prinzipiell wäre eine runden-Funktion das beste weil für jeden direkt ersichtlich.
 
Jo, Cast hatte ich jetzt weggelassen..
cast(round(datediff(month,iif(t4.TEintritt is null,t2.eintritt1,t4.TEintritt),timestamp ''today'')/12,2)*100 as integer)/100 as Jahr
So ging's bei Jahr und so wird's dann auch bei Monat gehen :-)

Runden, also abrunden geht irgendwie nicht. Round(Wert,0) rundet ja auf oder ab und round(Wert,0,1) geht im Firebird nicht
 
zu Vollständigkeit ist das der Monat:
Code:
iif(extract(day from timestamp ''today'') < extract(day from iif(t4.TEintritt is null,t2.eintritt1,t4.TEintritt)), cast(round(datediff(month,iif(t4.TEintritt is null,t2.eintritt1,t4.TEintritt),timestamp ''today''),2)*100 as integer)/100 - 1 - cast(round(datediff(month,iif(t4.TEintritt is null,t2.eintritt1,t4.TEintritt),timestamp ''today''),2)*100 as integer)/100 / 12 * 12, cast(round(datediff(month,iif(t4.TEintritt is null,t2.eintritt1,t4.TEintritt),timestamp ''today''),2)*100 as integer)/100 - cast(round(datediff(month,iif(t4.TEintritt is null,t2.eintritt1,t4.TEintritt),timestamp ''today''),2)*100 as integer)/100 / 12 * 12) as Monat

letzte part:

Code:
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)

was bedeutet day(dateadd(... ??
 
Zuletzt bearbeitet:
Code:
day(dateadd(mm,datediff(mm,-1,z.zeitraum_von),-1)) -

hier, damit habe ich ein Problem... weil:
dateadd(mm,datediff -> geht doch irgendwie nicht, weil wo soll er dateadd ausführen? dateadd(mm,3)-1) weil datediff gibt ja ne zahl wieder und kein Datum, somit weiß er ja garnicht wo er was dateadden soll ;-(
 
Code:
DECLARE    @zeitraum_von DATETIME
SET        @zeitraum_von = cast(convert(CHAR(10), getdate(), 104) AS DATETIME)

SELECT    day(dateadd(mm,datediff(mm,-1,@zeitraum_von),-1)),
        day(dateadd(mm,datediff(mm,-1,'2013-17-10 00:00:00.000'),-1)),
        day(dateadd(mm,1366,-1)),
        day('2013-31-10 00:00:00.000'),
-- Ergebnis ist immer 31, der Monatsletzte des laufenden Monats
 
Code:
Der OLE DB-Anbieter 'MSDASQL' für den Verbindungsserver 'MAND' hat die Meldung '[ODBC Firebird Driver][Firebird]expression evaluation not supported
Expected DATE/TIME/TIMESTAMP type as first and second argument to DATEDIFF' zurückgeben.
und ich habe extra
Code:
cast(dateadd(month,cast(datediff(month,-1,t4.TEintritt) as timestamp),-1) as timestamp)
alles als datum gecastet.

-.-" ich dreh ab... weil -1 kein Datumsformat ist, gehts nicht, kann man das umgehen? also statt -1 irgendwie was
 
Das -1 in der äußeren dateadd() Funktion ist an der falschen Stelle. Abgesehen davon machst du glaube ich ein paar überflüssige Schritte (zumindest der letzte cast() ist über) und TIMESTAMP != DATETIME, den würde ich nur verwenden wenn er gemäß seiner Bestimmung eingesetzt wird.
http://aspalliance.com/1785_Understanding_TIMESTAMP_ROWVERSION_in_SQL_Server
(Ich hatte mal einen besseren Artikel aber finde ich leider nicht wieder)

Code:
DECLARE    @TEintritt DATETIME
SET        @TEintritt = cast(convert(VARCHAR(10), getdate(), 104) AS DATETIME)

SELECT    @TEintritt, -- 2013-10-18 00:00:00.000
        datediff(month,-1,@TEintritt), -- 1366,
        cast(datediff(month,-1,@TEintritt) AS TIMESTAMP), -- 0x0000000000000556
        cast(datediff(month,-1,@TEintritt) AS DATETIME), -- 1903-09-29 00:00:00.000
        dateadd(month,-1,cast(datediff(month,-1,@TEintritt) AS DATETIME)), -- 1903-08-29 00:00:00.000
        cast(dateadd(month,-1,cast(datediff(month,-1,@TEintritt) AS DATETIME)) AS DATETIME) -- 1903-08-29 00:00:00.000
 
Code:
Select datediff(month,-1,t4.TEintritt)
ergibt Fehler...
Der OLE DB-Anbieter 'MSDASQL' für den Verbindungsserver 'MAND' hat die Meldung '[ODBC Firebird Driver][Firebird]expression evaluation not supported
Expected DATE/TIME/TIMESTAMP type as first and second argument to DATEDIFF' zurückgeben.
datediff MUSS in der Syntax angegeben werden
http://www.firebirdsql.org/refdocs/langrefupd21-intfunc-datediff.html
daran scheiterts... weil datediff(monat,Zeitangabe1,Zeitangabe2)
-1 ist keine Zeitangabe...
 
In MSSQL ist der Ausdruck möglich. Du kannst ihn aber auch sicher mit anderen Funktionen umschreiben, wichtig ist das das Ergebnis immer stimmt. Also Monatswechsel etc. testen.

Auf die schnelle geht z.B. auch (year(TEintritt)-1900)*12+month(TEintritt) aber das sieht noch nicht sehr elegant aus.
 
Werbung:
aah, das sieht doch mal nach was aus :)

aber, so wie es jetzt ist gibts bei folgenden Konstellationen folgendes Ergebnis:

TEintritt = 01.01.2001
year(TEintritt)-1900 --- 2001-1900 = 101
101*12 = 1212
+
month(01)
=1212+1
= 1213

Beim Ausführen kommt folgendes:
Der OLE DB-Anbieter 'MSDASQL' für den Verbindungsserver 'MAND' hat die Meldung '[ODBC Firebird Driver][Firebird]conversion error from string "1213"' zurückgeben.

:-( wir kommen näher, aber noch nicht dran :)

Code:
cast(dateadd(month,-1,cast(datediff(month, cast((extract(year from t4.TEintritt)-1900)*12+extract(month from t4.TEintritt) as timestamp),t4.teintritt)

habe jetzt auch ma

Code:
cast(extract(day from T4.TEintritt) || extract(month from T4.TEintritt) || (extract(year from t4.TEintritt)-1900)*12+extract(month from t4.TEintritt) as date)
versucht, damit wir nen ordnetliches Datum haben. Geht auch nicht
 
Zuletzt bearbeitet:
Zurück
Oben