Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 根据货币和日期选择汇率_Mysql_Date_Rate - Fatal编程技术网

Mysql 根据货币和日期选择汇率

Mysql 根据货币和日期选择汇率,mysql,date,rate,Mysql,Date,Rate,我四处寻找解决办法,但至少我找不到任何与我的情况类似的东西 我需要根据购买产品的日期选择汇率。 让我试着解释一下 我有一张有货币的桌子: CREATE TABLE `tblCurrencies` ( `CurrID` int(11) NOT NULL AUTO_INCREMENT, `CurencySymbol` varchar(1) DEFAULT NULL, `CurrencyCode` varchar(3) DEFAULT NULL, `CurrencyDescriptio

我四处寻找解决办法,但至少我找不到任何与我的情况类似的东西

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

我有一张有货币的桌子:

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
等等

我希望有一个查询,根据购买产品的日期和购买货币选择唯一的汇率

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

请注意,根据上述示例,汇率是在随机日期设定的

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

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)

我自己也是初学者,所以不能保证正确性。我相信您必须使用特定的应用程序编程语言和SQL,例如PHP。不过,我将概述我将采取的基本步骤。 1.使用简单的SELECT语句将购买货币ID和购买日期分配给变量。假设我把ID给targetID,把日期给targetDate。
2.从tblExchRates中选择MINDate,其中Date是一个非常简单的解决方案

SELECT 
    p.*
    ,(SELECT TOP 1 er.Exchange
     FROM tblExchRates AS er
     INNER JOIN tblCurrencies AS c ON er.CurrKey = c.CurrID AND c.CurrencyCode = 'EUR'
     WHERE er.Date <= p.PurchaseDate
     ORDER BY er.Date DESC) AS ExchangeRate
FROM
     tblProducts AS p

另一种选择是,如果您可以控制模式,那么将汇率表更改为DateFrom和DateTo,而不仅仅是日期,这意味着您可以简单地使用BETWEEN关键字找到正确的汇率。

Pro提示:欢迎初学者,但我们希望在发布问题之前,在问题上花费一定的精力。我们不为您编写代码,尽管我们非常愿意帮助您解决您编写的代码的问题。我不希望您为我编写代码,我只想了解如何解决该需求的技巧。然后我自己写代码。基本上,我不知道从哪里开始:我需要两个单独的查询吗?预期的输出是什么?多亏了一百万个Dazz,这似乎工作得很好!!是的,你是对的,我将更改exchangerate表以反映从开始到现在的日期,这无疑会使事情变得更简单: