繁体   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