根据货币和日期选择汇率

时间:2019-02-22 10:13:39

标签: mysql date rate

我一直在寻找解决方案,但是至少我找不到与我的情况至少相似的东西。

我需要根据购买产品的日期选择汇率。 让我尝试解释一下。

我有一张带有货币的表:

CREATE TABLE `tblCurrencies` (
  `CurrID` int(11) NOT NULL AUTO_INCREMENT,
  `CurencySymbol` varchar(1) DEFAULT NULL,
  `CurrencyCode` varchar(3) DEFAULT NULL,
  `CurrencyDescription` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`CurrID`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

带有汇率表:

CREATE TABLE `tblExchRates` (
  `ExcID` int(11) NOT NULL AUTO_INCREMENT,
  `CurrKey` int(11) DEFAULT NULL,
  `Date` date DEFAULT NULL,
  `Exchange` decimal(11,3) DEFAULT NULL,
  PRIMARY KEY (`ExcID`),
  KEY `CurrKey` (`CurrKey`),
  CONSTRAINT `tblExchRates_ibfk_1` FOREIGN KEY (`CurrKey`) REFERENCES `tblCurrencies` (`CurrID`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=111 DEFAULT CHARSET=utf8;

还有一个包含产品的表格(请注意,我的产品在表格中以数字列出,在我的情况下可以):

CREATE TABLE `tblProducts` (
  `ProductID` int(11) NOT NULL AUTO_INCREMENT,
  `Contract` int(11) DEFAULT NULL,
  `Product` int(11) DEFAULT NULL,
  `Type` varchar(100) DEFAULT NULL,
  `Currency` int(11) DEFAULT NULL,
  `Amount` decimal(10,0) DEFAULT NULL,
  `PurchaseDate` datetime DEFAULT NULL,
  PRIMARY KEY (`ProductID`),
  KEY `Contract` (`Contract`),
  KEY `Currency` (`Currency`),
  CONSTRAINT `tblShopCart_ibfk_2` FOREIGN KEY (`Currency`) REFERENCES `tblCurrencies` (`CurrID`) ON DELETE RESTRICT ON UPDATE CASCADE,
  CONSTRAINT `tblShopCart_ibfk_1` FOREIGN KEY (`Contract`) REFERENCES `tblContracts` (`ContractID`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=3155 DEFAULT CHARSET=utf8;

在汇率表中,例如,值设置如下:

CurrKey              Date                 Exchange
1                    15-01-2017           0.850
1                    31-01-2017           0.856
1                    02-02-2018           0.918
1                    18-02-2018           0.905
2                    04-02-2018           1.765
2                    14-02-2018           1.755

依此类推...

我想查询一个基于购买产品的日期和购买货币选择唯一汇率的查询。

换句话说,例如,如果我有一个产品购买于07-02-2018,则查询必须选择在与购买日期及其货币匹配的相关日期范围内有效的汇率。在此示例中,对于2018年7月2日购买的产品,其currkey为1的正确汇率为0.918

请注意,汇率是在随机日期设置的(按照上面的示例)。

我设法进行了查询,但这并不精确,因为它有时会返回两个或多个结果(由于我设置的10天范围),而我只需要1个结果:

SELECT
tblExchRates.Exchange
FROM
tblCurrencies
INNER JOIN tblExchRates ON tblExchRates.CurrKey = tblCurrencies.CurrID
WHERE
tblCurrencies.CurrencyCode = "EUR" AND
tblExchRates.Date BETWEEN (tblProducts.PurchaseDate - INTERVAL 10 DAY) AND (tblProducts.PurchaseDate + INTERVAL 10 DAY)

2 个答案:

答案 0 :(得分:0)

我本人还是一个初学者,因此不能保证正确性。我相信您必须与SQL一起使用某种应用程序编程语言,例如PHP。不过,我将概述我将要采取的基本步骤。



1。使用简单的SELECT语句将购买货币ID和购买日期分配给变量。假设我将ID赋予 targetID ,并将日期赋予 targetDate
2。从tblExchRates的日期<= targetDate 和CurrKey = targetID 中选择MIN(Date); //选择最近的日期,该日期的范围包括匹配货币ID中的购买日期。将此语句的结果分配给另一个变量。假设我使用了变量 dateRange
3。从tblExchRates的WHERE日期= targetDate 中选择交换; //找到所选日期的汇率。
请注意,有许多方法可以执行此操作。例如,您可以使用表JOINS(请参阅此链接:https://www.w3schools.com/sql/sql_join.asp)或仅在一个SQL语句中从不同表中选择列(请参阅此堆栈溢出问题:MySQL Select all columns from one table and some from another table)。最后,您可以使用SQL创建变量(请参考此问题:Set the variable result, from query),然后执行操作。

答案 1 :(得分:0)

对于一个相当简单的解决方案,您可以做

number, number

另一个选择,如果您可以控制架构,然后将汇率表更改为具有DateFrom和DateTo而不是仅包含日期,则意味着您可以使用BETWEEN关键字简单地找到正确的汇率。