簡體   English   中英

獲取歷史匯率,並使用今天的匯率作為未來日期

[英]Getting Exchange Rates for Historical and Using Today's Rate for Future Dates

有一個表A,其中包含開始和結束日期,價格和貨幣代碼。 有一個表B,該表具有歷史+今天的匯率。 我需要根據以下假設轉換表A價格:

  • 對於歷史日期(即開始和結束日期)<今天的日期,我將獲得其平均匯率並將其用於換算。
  • 任何將來的日期(日期>今天)都將使用今天的匯率。

基本上,我需要獲取WeekStart的持續時間-WeekEnd日期的平均匯率。

這是表B的架構/一些示例數據,其中包含匯率。

DateTime                     Date       FromCurrCode  ToCurrCode   Rate
    2016-07-07 07:16:12.000       2016-07-07    USD        CAD         1.2939
    2016-07-06 07:27:12.000       2016-07-06    USD        CAD         1.3017
    2016-07-05 07:34:07.000       2016-07-05    USD        CAD         1.2922
    2016-07-04 07:42:07.000       2016-07-04    USD        CAD         1.2853
    2016-07-03 07:52:06.000       2016-07-03    USD        CAD         1.2908
    2016-07-02 07:06:08.000       2016-07-02    USD        CAD         1.2915

這是表A的模式/示例數據,其具有WeekStart和WeekEnd日期:

order#      WeekStart                        WeekEnd                    Curr
1256      2016-07-04 00:00:00.000            2016-07-10 00:00:00.000    USD
1255      2016-07-04 00:00:00.000            2016-07-10 00:00:00.000    USD

根據表B,由於結束日期是將來的日期,因此平均費率應按以下方式計算:

2016-07-04 ---- Use historical currency
2016-07-05 ---- Use historical currency
2016-07-06 ---- Use historical currency
2016-07-07 ---- Use today's currency rate 
2016-07-08 ---- Use today's currency rate 
2016-07-09 ---- Use today's currency rate 
2016-07-10 ---- Use today's currency rate 

然后,使用上面的這些比率,它將為表A中的每一行返回平均比率作為一列。

但是,如果WeekStart和WeekEnd日期是過去的日期,並且小於今天的日期,則它將僅使用表B中的歷史匯率來計算Start-End的平均值。

我是否可以假定可以通過函數完成操作? 那將是最好的方法。 如果是這樣,函數實現將是什么樣子。

DECLARE @ToCurrCode CHAR(3) = 'CAD'

;WITH cteTally AS (
    SELECT 0 AS I
    UNION ALL
    SELECT I + 1 AS I
    FROM
       cteTally
    WHERE i + 1 <= 6
)

SELECT
    a.OrderNum
    ,AVG(b.Rate) AS AvgRate
FROM
    TableA a
    INNER JOIN cteTally t
    ON DATEDIFF(day,a.WeekStart,a.WeekEnd) >= t.I
    LEFT JOIN TableB b
    ON (CASE
          WHEN DATEADD(day,t.i,a.WeekStart) <= CAST(GETDATE() AS DATE) THEN DATEADD(day,t.i,a.WeekStart)
          ELSE CAST(GETDATE() AS DATE)
       END) = b.[Date]
       AND a.Curr = b.FromCurrCode
       AND b.ToCurrCode = @ToCurrCode
GROUP BY
    a.OrderNum

用遞歸公用表表達式[CTE]創建一個理貨表,這實際上將使您長達1周的記錄變成x#天。 這是基於0的,所以6實際上是7天。

將其加入訂單以使用創建每天的一行。

將其加入您的匯率表,使用與我之前的答案類似的案例聲明,即當日期> =今天時,然后使用今天的日期進行加入。 注意,如果您缺少數據,我將使用左聯接。

然后進行匯總,得出平均值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM