最初に、日付順に並べられた為替レートで自己結合を実行して、日付の重複やギャップなしに、各為替レートの開始日と終了日を取得できます(データベースにビューとして追加することもできます-私の場合、一般的なテーブル式を使用しています。
これらの「準備された」レートをトランザクションに結合するのは簡単で効率的です。
次のようなもの:
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)
注:
-
GETDATE()
を置き換えることができます 遠い将来の日付で、私はここで将来の料金が知られていないと仮定しています。 -
ルール(B)は、最初の既知の為替レートの日付をSQLServerの
datetime
でサポートされている最小の日付に設定することで実装されます。 、これは(定義上、Date
に使用しているタイプの場合) 列)可能な限り最小の値にします。