我希望创建一个包含以下列的 3 列 VAT_Parameter 表:
VATID, VATRate, EffectiveDate
但是,我不知道如何确定发票日期适用的增值税率。
例如,如果表中填充了:
1, 17.5, 1/4/1991
2, 15, 1/1/2009
3, 20, 4/1/2011
例如,我有一张日期为 2010 年 4 月 5 日的发票,SQL 查询如何选择该日期的正确增值税率?
我希望创建一个包含以下列的 3 列 VAT_Parameter 表:
VATID, VATRate, EffectiveDate
但是,我不知道如何确定发票日期适用的增值税率。
例如,如果表中填充了:
1, 17.5, 1/4/1991
2, 15, 1/1/2009
3, 20, 4/1/2011
例如,我有一张日期为 2010 年 4 月 5 日的发票,SQL 查询如何选择该日期的正确增值税率?
select top 1 *
from VatRate
where EffectiveDate<=@InvoiceDate
order by EffectiveDate desc
或者,使用发票表
select id, invoicedate, rate
from
(
select
inv.id, inv.invoicedate, vatrate.rate, ROW_NUMBER() over (partition by inv.id order by vatrate.effectivedate desc) rn
from inv
inner join vatrate
on inv.invoicedate>=vatrate.effectivedate
) v
where rn = 1
PS。税率变化时的增值税税率规则比发票日期更复杂。例如,供应日期也很重要。
我以前遇到过这种事情。我能想到的选择有两种:
1.展开表格以具有两个日期:EffectiveFrom 和 EffectiveTo。(您必须对这些中的每一个是排他的还是包含的有一个约定——但这在使用日期时总是一个问题)。这引发了验证表总体是否有意义的问题。例如,您最终不会得到从 2000 年 1 月 1 日到 2002 年 1 月 1 日生效的 Rate1 的一行,以及从 2001 年 10 月 30 日到 2003 年 1 月 1 日生效的 Rate2 的另一行(重叠)。或未覆盖的时间间隔,不适用任何费率。由于这听起来像是一个变化非常缓慢的表格,偶尔会填充(由知道自己在做什么的人?),这可能是最好的解决方案。获得有效利率的 SQL 将很简单:
SELECT VATRate FROM VATTable WHERE (EffectiveFrom<=[YourInvoiceDate]) AND (EffectiveTo>=[YourInvoiceDate])
或者
2.使用您现有的表结构,并使用一些稍微复杂的 SQL 来确定发票的有效汇率。
使用您现有的结构,这样的事情会起作用:
SELECT VATTAble.VATRate FROM
VATTable
INNER JOIN
(SELECT Max(EffectiveDate) AS LatestDate FROM VATTable WHERE EffectiveDate<=
YourInvoiceDate) latest
ON VATTable.EffectiveDate=latest.LatestDate
一个更简单的选择可能只是对您的数据结构进行非规范化并将增值税率存储在发票表本身中。