/ / Dateadd ohne Funktion - SQL, Tsql, Datum, Mathematik

Dateadd ohne Funktion - sql, tsql, date, math

Wir behalten unsere Termine im DWH im int-Format. Ich möchte einige einfache Dateadd-Berechnungen durchführen (Monate von einem Datum hinzufügen und subtrahieren), ohne dass ich das Datum konvertieren und zurück in int konvertieren muss.

Ich konnte mit zwei Methoden zum Abschluss kommen:
1. Verwenden der Modulo- und Absolutfunktionen:

DECLARE @EffectiveDate INT = 20121003,
@Diff          INT = -12

SELECT @EffectiveDate + ( Abs(@Diff) / @diff ) * ( Abs(@Diff) + mnt ) / 12 *
10000 + (
Abs(@Diff) / @diff ) * ( ( Abs(@Diff) + mnt - 1 )%12 - mnt + 1 ) *
100
FROM   (SELECT @EffectiveDate / 100%100 Mnt)T

2. Durch Berechnung des Jahres in Monaten, Addieren / Abziehen der erforderlichen Monate und Teilen durch 12:

DECLARE @EffectiveDate INT = 20121003,
@Diff          INT = -12

SELECT ( yr * 12 + mnt + @Diff ) / 12 * 10000 +
( yr * 12 + mnt + @Diff )%12 * 100 + 1
FROM   (SELECT @EffectiveDate / 100%100 Mnt,
@EffectiveDate / 10000   Yr)T

In beiden Fällen habe ich dasselbe Problem, der Dezember wird falsch als 0 dargestellt und wirkt sich auch auf das Jahresergebnis aus.

Irgendwelche Ideen?

Antworten:

2 für die Antwort № 1

Deine Logik ist falsch:

SELECT  ( yr * 12 + mnt + @Diff - 1) / 12 * 10000 +
(( yr * 12 + mnt + @Diff - 1) % 12 + 1) * 100 + 1
FROM   (SELECT @EffectiveDate / 100%100 Mnt,
@EffectiveDate / 10000   Yr)T

Natürlich wäre alles viel einfacher, wenn Sie Ihre Daten in DATEs ablegen :)