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 № 1Deine 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 :)