Trước tiên, bạn có thể tự tham gia tỷ giá hối đoái được sắp xếp theo ngày để bạn có ngày bắt đầu và ngày kết thúc của mỗi tỷ giá hối đoái mà không có bất kỳ sự trùng lặp hoặc chênh lệch nào về ngày tháng (có thể thêm nó làm chế độ xem vào cơ sở dữ liệu của bạn - trong trường hợp của tôi, tôi chỉ đang sử dụng một biểu thức bảng chung).
Giờ đây, việc tham gia các tỷ giá "chuẩn bị sẵn" đó với các giao dịch thật đơn giản và hiệu quả.
Một cái gì đó như:
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)
Ghi chú:
-
Bạn có thể thay thế
GETDATE()
với một ngày trong tương lai xa, ở đây tôi giả định rằng không có tỷ lệ nào cho tương lai được biết trước. -
Quy tắc (B) được thực hiện bằng cách đặt ngày của tỷ giá hối đoái đã biết đầu tiên thành ngày tối thiểu được hỗ trợ bởi SQL Server
datetime
, nên (theo định nghĩa nếu đó là loại bạn đang sử dụng choDate
cột) là giá trị nhỏ nhất có thể.