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 tilDatekolonne) være den mindst mulige værdi.