आप पहले एक्सचेंज दरों पर एक सेल्फ-जॉइन कर सकते हैं जो तारीख के अनुसार आदेशित हैं ताकि आपके पास प्रत्येक विनिमय दर की शुरुआत और समाप्ति तिथि हो, बिना किसी ओवरलैप या तिथियों में अंतर के (शायद इसे अपने डेटाबेस में देखें - मेरे मामले में मैं सिर्फ एक सामान्य तालिका अभिव्यक्ति का उपयोग कर रहा हूं)।
अब उन "तैयार" दरों को लेनदेन के साथ जोड़ना सरल और कुशल है।
कुछ इस तरह:
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()
. को बदल सकते हैं दूर भविष्य में एक तारीख के साथ, मैं यहां मान रहा हूं कि भविष्य के लिए कोई दर ज्ञात नहीं है। -
नियम (बी) पहली ज्ञात विनिमय दर की तारीख को SQL सर्वर द्वारा समर्थित न्यूनतम तिथि पर सेट करके कार्यान्वित किया जाता है
datetime
, जो होना चाहिए (परिभाषा के अनुसार यदि यह वह प्रकार है जिसका उपयोग आपDate
. के लिए कर रहे हैं कॉलम) सबसे छोटा संभव मान हो।