Announcement

Collapse
No announcement yet.

Tagesdifferenz zwischen zwei Daten bei einem Basisjahr mit 360 Tagen

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

  • Tagesdifferenz zwischen zwei Daten bei einem Basisjahr mit 360 Tagen

    Hallo zusammen,

    gibt es eine Möglichkeit in SQL die Tagesdifferenz zwischen zwei Daten (Datums ;-) ) bei einem Basisjahr mit 360 Tagen zu berechnen?
    Dies wird z.B. bei der Zinsrechnung oder aber bei der Mietberechnung angewandt. Mir ist jedoch nur der SQL-Befehl <I>DATEDIFF</I> bekannt, der mit dem Parameter <I>DAY</I> die Tagesdifferenz bei einem Basisjahr mit 365 Tagen berechnet.
    Das ganze sollte möglichst sowohl auf SQL-Server 7.0 als auch 2000 funktionieren.

    Eine Möglichkeit wäre diese Funktionalität als benutzerdefinierte Funktion zu programmieren. Dies ist aber unter SQL-Server 7.0 nicht möglich.
    Hat jemand schon einmal eine solche Funktion für den SQL-Server 2000 entwickelt?

    Viele Grüße

    Volker

  • #2
    Hallo Volker,

    kann doch nicht so schwer sein, wenn man davon ausgeht, dass dieses Jahr deswegen 360 Tage hat, weil es sich um 12 Monate zu je 30 Tagen handelt.
    Also sollte das etwa so aussehen (Beispiel für den Query Analyzer):

    declare @d1 datetime, @d2 datetime<BR>
    declare @jahre int, @monate int, @tage int<BR>
    <BR>
    set @d1 = '20021231'<BR>
    set @d2 = '20030101'<BR>
    <BR>
    select @jahre = datepart(yy,@d2) - datepart(yy,@d1)<BR>
    select @monate = datepart(m,@d2) - datepart(m,@d1)<BR>
    select @tage = datepart(d,@d2) - datepart(d,@d1)<BR>
    <BR>
    select @jahre * 360 + @monate * 30 + @tage as Differenz<BR>
    <BR>
    ... habe da gleich mal bewusst den 31. Dezember mit dem 1. Jänner verglichen und wenn ein Monat immer nur 30 Tage hat, dann wäre ja der 31. 12. eigentlich der 1.1. und somit würde die rechnung stimmen. Ob das in der Zins- oder Mietrechnung auch so gehandhabt wird, kann ich dir nicht sagen, aber vielleicht ist das mal ein Ansatz.

    tschüß,
    Helmu

    Comment


    • #3
      Hallo Helmut,

      vielen Dank für deine Antwort.

      Dein Vorschlag ist grundlegend schon richtig.

      Ein Problem ist jedoch der Februar. Wenn z.B. ein Mietvertrag vom 01.02 bis 28.02. gültig ist, dann ist trotzdem die volle Monatsmiete fällig.
      In dein Beispiel eingesetzt ergibt
      set @d1 = '20020201'
      set @d2 = '20020228'
      jedoch eine Tagesdidfferenz von 27.

      Volke

      Comment


      • #4
        Hallo Volker,

        das sind eben die Details, bei denen ich nicht weiß, wie sie gehandhabt werden. Vielleicht wird jedes Monat irgendwie auf 30 Tage umgerechnet, also etwa so:

        (30 / Anzahl Tage im Kalendermonat des Datums) * Tag des Datums

        ... ergibt am 28.2. bei einem Februar mit 28 Tagen dann (30 / 28) * 28, also genau 30 Tage im Februar. Allerdings fehlen jetzt wieder die Rundungsregeln, also wie bzw. ab wann wird aufgerundet oder abgerundet.<BR>
        Das alles lässt sich mit wenig Aufwand einbauen, da ja nur das Monat des Startdatums und des Endedatums gecheckt werden müssten, alle anderen Monate dazwischen haben per Definition ja fix 30 Tage. Fehlen eigentlich nur mehr die Rundungsdefinitionen.

        Ach ja, wegen der anderen Sache einfach immer 1 zum Resultat dazuzählen, dann ergibt 1.2. bis 28.2. 28 Tage und nicht 27. Aber auch da war mir ja nicht klar, ob zB. 1.2.2003 bis 1.2.2003 als Ergebnis 1 oder 0 liefern soll (ist ungefähr so wie das Problem, ob der index in einem Array mit 0 oder mit 1 beginnt).

        bye,
        helmu

        Comment

        Working...
        X