Anda dapat terlebih dahulu melakukan self-join pada nilai tukar yang diurutkan berdasarkan tanggal sehingga Anda memiliki tanggal mulai dan tanggal akhir dari setiap nilai tukar, tanpa tumpang tindih atau celah pada tanggal (mungkin tambahkan itu sebagai tampilan ke database Anda - dalam kasus saya, saya hanya menggunakan ekspresi tabel umum).
Sekarang bergabung dengan tarif "yang disiapkan" itu dengan transaksi yang sederhana dan efisien.
Sesuatu seperti:
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)
Catatan:
-
Anda dapat mengganti
GETDATE()
dengan tanggal di masa depan yang jauh, saya berasumsi di sini bahwa tidak ada tarif untuk masa depan yang diketahui. -
Aturan (B) diterapkan dengan menetapkan tanggal nilai tukar pertama yang diketahui ke tanggal minimal yang didukung oleh
datetime
SQL Server , yang seharusnya (menurut definisi jika itu adalah jenis yang Anda gunakan untukDate
kolom) menjadi nilai sekecil mungkin.