SQL Query zur Ermittlung des Mehrwertsteuersatzes

Ich schaue, um eine 3 Säule VAT_Parameter Tabelle mit den folgenden Spalten zu erstellen:

VATID, VATRate, EffectiveDate 

Allerdings kann ich nicht meinen Kopf um, wie ich identifizieren würde, welche Rechnungsrate gilt für ein Rechnungsdatum.

zum Beispiel wenn der Tisch belegt war mit:

 1, 17.5, 1/4/1991 2, 15, 1/1/2009 3, 20, 4/1/2011 

Sagen zum Beispiel habe ich eine Rechnung vom 4/5/2010, wie würde eine SQL-Abfrage den richtigen MwSt-Satz für dieses date auswählen?

 select top 1 * from VatRate where EffectiveDate<=@InvoiceDate order by EffectiveDate desc 

Oder mit einer tabelle von rechnungen

 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 Die Regeln für die Mehrwertsteuer werden berechnet, wenn die Satzänderungen komplizierter sind als das Rechnungsdatum. Zum Beispiel ist das Lieferdatum auch wichtig.

Ich habe schon in diese Art von Ding gelaufen. Es gibt zwei Möglichkeiten, die ich mir vorstellen kann:

1. Erweitern Sie die Tabelle, um zwei Termine zu haben: EffectiveFrom und EffectiveTo. (Sie müssen eine Konvention darüber haben, ob jeder von ihnen exklusiv oder inklusive ist – aber das ist immer ein Problem bei der Verwendung von data). Dies wirft das Problem der validation auf, dass die Tischpopulation als Ganzes sinnvoll ist. zB, dass Sie nicht mit einer Zeile mit Rate1 gültig ab 1/1 / 2000-1 / 1/2002 und eine andere (überlappende) mit Rate2 gültig ab 30/10 / 2001-1 / 1/2003. Oder eine ungedeckte Lücke in der time, wo kein Satz gilt. Da klingt das wie ein sehr langsam wechselnder Tisch, gelegentlich bevölkert (von Leuten, die wissen, was sie tun?), Könnte dies die beste Lösung sein. Die SQL, um die effektive Rate wäre dann einfach:

 SELECT VATRate FROM VATTable WHERE (EffectiveFrom<=[YourInvoiceDate]) AND (EffectiveTo>=[YourInvoiceDate]) 

oder

2. Verwenden Sie Ihre vorhandene Tabellenstruktur und verwenden Sie etwas etwas komplizierteres SQL, um die effektive Rate für eine Rechnung zu ermitteln.

Mit deiner bestehenden Struktur würde so etwas funktionieren:

 SELECT VATTAble.VATRate FROM VATTable INNER JOIN (SELECT Max(EffectiveDate) AS LatestDate FROM VATTable WHERE EffectiveDate<= YourInvoiceDate) latest ON VATTable.EffectiveDate=latest.LatestDate 

Eine einfachere Option kann nur sein, um Ihre datastruktur zu sormalisieren und den Mehrwertsteuersatz in der Rechnungstabelle selbst zu speichern.