Oracle: Problem bei Jahreszähler

Communicate

Mitglied
Hallo zusammen,

ich stehe mal wieder auf dem Schlauch...

Folgendes möchte ich erreichen:

2 Tabellen sind vorhanden "Rechnung" und "Vertragsdaten".

In der Tabelle Rechnung ist die Spalte "Gebühr" und "Gebühr_datum" relevant, in der Tabelle Vertragsdaten die Spalte "Vertragsbeginn".

Ziel ist es nun, zu prüfen, wieviel Gebühren innerhalb der letzten 365 Tagen nach Vertragsbeginn erzielt worden sind. Die Problematik liegt nun darin, dass es im 2 Jahr ja nun schon 730 Tage sind, im dritten Jahr sind es dann 1095 Tage und so weiter.

Ich hatte nun schon zig Ideen, aber alle führen nicht zum ziel. Als Code-Schnippsel ist im moment eigentlich nur noch foglendes übrig geblieben. Wie ich das Datum korrekt einschränken kann, will mir partout nicht einfallen.

Code:
SELECT sum(rechnung.gebuehr) as summe_fg
FROM rechnung, vertragsdaten
where rechnung.kunden_id = vertragsdaten.kunden_id and
to_date(rechnung.gebuehr_datum) <= to_date(vertragsdaten.vertragsbeginn+365) and
to_date(rechnung.gebuehr_datum) > to_date(vertragsdaten.vertragsbeginn)

Vielleicht könnt Ihr mir ja helfen ?

Grüße
Dominic
 
Zuletzt bearbeitet:
Du willst die Gebühren der letzten 365 Tage summieren?
Also Bspw.
Vertragsbeginn 1.1.2000 die letzten 365 Tage sind dann
(heute=14.10.2009) 15.10.2008 bis 14.10.2009
Vertragsbeginn 1.1.2009 die letzten 365 Tage sind dann
1.1.2009 bis 14.10.2009
oder wie?
 
Hi,

so ähnlich :) Ich möchte die Gebühren eines Vertragsjahrs aufsummieren.

Ein Vertragsjahr dauert immer 365 Tage und dafür brauche ich die Gebühren.


Beispiel: Vertragsbeginn: 01.01.2000 ==> Ende erstes Vertragsjahr 31.12.2000
oder
Vertragsbeginn: 15.08.2008 ==> Ende erstes Vertragsjahr 14.08.2009.

Ich hoffe, ich habe mich verständlich ausgedrückt...
 
Also einfach
...
to_date(rechnung.gebuehr_datum)
Between
to_date(vertragsdaten.vertragsbeginn) and
to_date(vertragsdaten.vertragsbeginn+365)

Wo aber ist nun das Problem mit dem 2. und dem 3. Jahr etc.
 
Oder meinst du die Gebühren im letzten Vertragsjahr?

Also von heute rückwirkend bis zum Tag, des Vertragsbeginns.
Bsp.
Vertragsbeginn 14.3.2000 gesucht sind also alle Gebühren des letzten Vertragsjahres, also von 14.3.2009 bis heute?
 
Hi!

Also erstmal vielen dank!

Das Problem liegt darin, dass ich ja vorher nicht weiss, ob ich 365 Tage , 730, 1095 etc. Tage dazu addieren muss.

War der Vertragsbeginn 2008 ist es noch eindeutig: vertragsbeginn + 365
War der Vertragsbeginn jedoch z.B. 2007 müsste ich (ausgehend von aktuellem jahr 2009) ja 720 dazuaddieren. Als Mensch ist mir das klar udn logisch, aber wie bringe ich das der Oracle Maschine bei?
 
Vielleicht geht es so:
...
to_date(rechnung.gebuehr_datum)
Between
to_date(vertragsdaten.vertragsbeginn) and
to_date(to_char(vertragsdaten.vertragsbeginn,'dd.mm.' || to_char(SYSDATE,'YYYY'))
Das ist Oracle-Syntax
Was passiert da
Ich nehme alle Tage zwischen Vertragsbeginn und dem Tag des Vertragsbeginns im aktuellen Jahr
Beispiel
Vertragsbeginn 14.2.2000
Alle Tage zwischen
14.2.2000 und
14.2.2009
Wobei ich mir 14.2.2009 mittels
to_char() zusammen bastele
to_char(vetragsdaten.vertragsbeginn,'dd.mm.') ergibt '14.02.' und
to_char(SYSDATE,'YYYY') liefert das Jahr, von heute, also '2009'
durch || füge ich die beiden Strings zu '14.02.2009' zusammen
und mache durch to_Date wieder ein Datum draus.
 
Zuletzt bearbeitet:
Hi!

Das sieht doch schonmal auf den ersten Blick gut aus. Vielen Dank dafür!

Das zusammensetzten des neuen Datums
to_date(to_char(vertragsdaten.vertragsbeginn,'dd.mm.' || to_char(SYSDATE,'YYYY'))
gefällt ihm aber noch nicht so richtig. Zum einen fehlt eine Klammer (rechts) aber das viel schlimmere: Es gibt einen ORA-01821: Datumsformat wurde nciht erkannt fehler :-(

Mal schauen, wie wir das noch hinkriegen...
 
Muß wohl heissen
to_date( to_char(vertragsdaten.vertragsbeginn,'dd.mm.') || to_char(SYSDATE,'YYYY')
)
oder
to_date( to_char(vertragsdaten.vertragsbeginn,'dd.mm.') || to_char(SYSDATE,'YYYY'), 'dd.mm.yyyy'
)
vop
 
das wars!

Vielen Dank!

Habe nur noch eine kleine Änderung vorgenommen um nur das letzte jahr zu bekommen.

Statt
Code:
Between 
to_date(vertragsdaten.vertragsbeginn) and 
to_date( to_char(vertragsdaten.vertragsbeginn,'dd.mm.') || to_char(SYSDATE,'YYYY'), 'dd.mm.yyyy')

habe ich
Code:
Between 
to_date( to_char(vertragsdaten.vertragsbeginn,'dd.mm.') || to_char(SYSDATE,'YYYY'), 'dd.mm.yyyy')-365 and to_date( to_char(vertragsdaten.vertragsbeginn,'dd.mm.') || to_char(SYSDATE,'YYYY'), 'dd.mm.yyyy'
)

genommen...
 
Zurück