Du kan først lave en selvtilslutning på de valutakurser, der er sorteret efter dato, så du har start- og slutdatoen for hver valutakurs, uden nogen overlapning eller hul i datoerne (måske tilføje det som visning til din database - i mit tilfælde bruger jeg bare et almindeligt tabeludtryk).
Nu er det enkelt og effektivt at slutte sig til de "forberedte" priser med transaktionerne.
Noget som:
WITH IndexedExchangeRates AS (
SELECT Row_Number() OVER (ORDER BY Date) ix,
Date,
Rate
FROM ExchangeRates
),
RangedExchangeRates AS (
SELECT CASE WHEN IER.ix=1 THEN CAST('1753-01-01' AS datetime)
ELSE IER.Date
END DateFrom,
COALESCE(IER2.Date, GETDATE()) DateTo,
IER.Rate
FROM IndexedExchangeRates IER
LEFT JOIN IndexedExchangeRates IER2
ON IER.ix = IER2.ix-1
)
SELECT T.Date,
T.Amount,
RER.Rate,
T.Amount/RER.Rate ConvertedAmount
FROM Transactions T
LEFT JOIN RangedExchangeRates RER
ON (T.Date > RER.DateFrom) AND (T.Date <= RER.DateTo)
Bemærkninger:
-
Du kan erstatte
GETDATE()
med en dato i den fjerne fremtid, antager jeg her, at der ikke kendes nogen kurser for fremtiden. -
Regel (B) implementeres ved at sætte datoen for den første kendte valutakurs til den minimale dato, der understøttes af SQL Server
datetime
, som skal (per definition, hvis det er den type, du bruger tilDate
kolonne) være den mindst mulige værdi.