获取历史汇率并使用今天的未来日期汇率

时间:2016-07-05 20:48:00

标签: sql sql-server sql-server-2008

有一个表A,它有开始和结束日期,价格和CurrencyCode。 有一张表B,其中包含历史+今天的汇率。 我需要根据以下假设转换表A价格:

  • 对于历史日期(即开始和结束日期)<今天的日期,我 将获得他们的平均汇率并将其用于转换。
  • 任何未来日期(日期>今天)都将使用今天的汇率。

基本上,我需要获得WeekStart持续时间的平均汇率 - WeekEnd Date。

以下是表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 Dates:

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中的历史汇率计算起始端的平均值。

我认为这可以通过功能完成吗?那将是最好的方法。如果是这样,那么函数实现会是什么样子。

1 个答案:

答案 0 :(得分:1)

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]创建一个Tally表,它基本上会使您的1周长记录为x#天。这是0基础,所以6实际上是7天。

将其加入订单,使用。

每天创建一行

将其加入您的汇率表,使用类似的案例陈述到我之前的答案,该陈述说明当日期是> =今天然后使用今天的加入日期。注意我正在使用左连接,以防您丢失数据。

然后进行聚合并获得平均值。