我很抱歉这个模糊的标题,但我想要做的事情几乎不能用单行描述。
我有一个简单的网络应用程序,带有MySQL 5.1.30后端,以帮助我管理我的财务状况。它有一个bill
表:
id INT PRIMARY KEY,
date DATE
和bill_rows
表:
id INT,
bill INT REFERENCES bills (ID),
cost DECIMAL(16,2),
taxable TINYINT(1)
最后是taxed_bill_rows
视图,其中引入了另一个taxes
列:
SELECT
r.id AS `id`,
r.bill AS `bill`,
r.cost AS `cost`,
(CASE
WHEN i.taxable
THEN floor((r.cost * 1.05 * 1.075) * 100) / 100.00 - r.cost)
ELSE
0.00
END) AS `taxes`
FROM bill_rows r
1.05因素是联邦税率,1.075是省税率。 (* 1.05 * 1.075
不是一个错误:省税也适用于联邦税。)
但是,这些值不再是最新的(我实际上已经很晚了)。自今年1月1日 st 以来,联邦税率提高1%,最高为1.085
。
为了解决税率变化问题,我创建了一个新的tax_rates
表:
ID INT,
date DATE,
federal DECIMAL(4,2),
provincial DECIMAL(4,2)
每次税率变化时,我都会在那里插入新记录。
现在问题是,如何从我的观点中根据账单的date
字段获取相关税率?我不能只做LEFT JOIN tax_rates tr ON tr.date < b.date
,因为这可能会带来太多记录。在tax_rates
表中添加bills
外键可以做到这一点,但是这些变化是偶然的,似乎不值得。
答案 0 :(得分:1)
您的tax_rates
表需要两个日期列来指示开始和放大端:
CREATE TABLE tax_rates (
id INT,
start_date DATE,
end_date DATE,
federal_tax_rate DECIMAL(4,2),
provincial_tax_rate DECIMAL(4,2))
然后,您可以使用BETWEEN来加入:
JOIN tax_rates tr ON tr.date BETWEEN b.start_date AND b.end_date
答案 1 :(得分:0)
最佳性能和最佳维护,
任何其他解决方案都会变慢且不太可读
即您可以将字段start_date和end_date添加到tax_rates表中 和像
一样加入left join tax_rates tr on b.`date` between tr.start_date and tr.end_date
在这种情况下,您还应该在start_date中为第一条记录保留0,为最后一条记录保留大日期