2017-10-05 2 views
2

In einem Bericht, in dem ich Stunden für Serviceverträge ausgab, muss ich meine Vertragslaufzeiten auf Runden setzen.T-SQL: Auf Quartale aufzurunden

Momentan erhalte ich das Feld "Contract Hours" von Navision. Ich füge 10% (Firmenpolitik) zu diesen Stunden hinzu und dies führt zu einer Anzahl von Stunden, die wir verwenden können, um diesen Kunden in Rechnung zu stellen.

jedoch durch diese Weise erhalte ich wirklich seltsam Vertrag Stunden (10,04, 28,82, 9,57, ...) Jetzt gibt es eine Idee, wo wir diese Zahlen aufrunden zu .25, .50, .75 oder .00 Aber es muss immer aufgerundet werden. in 9,75

führen soll ich versucht habe, dies in 29,00

9,57 führen sollte ROUND(@value/25,2)*25 durch tun, aber dies gibt mir nicht das notwendige Ergebnis

10,04 in 10,25

28,82 führen sollte.

  • 10,04 wird 10 (wenn ich 10,25 erwarten)
  • 28.82 wird 28.75 (wenn ich 29.00 erwarten)
  • 9,57 wird 9,50 (wenn ich 9,75 erwarten)

Könnte jemand geben Sie mir einige extra Tipps, wie man damit umgeht?

Antwort

4

Sie können CEILING Funktion anstelle von ROUND verwenden, es wird Ihre Zahlen "runder" wenn zwischen zwei anderen, auch wenn sie "näher" an die kleinere Zahl sind.

Ihre Gesamtlogik zum Runden auf "Viertel" sah gut aus, aber die ROUND Funktion wählt den nächsten, nicht den "nächstgrößeren".

Sie könnten auch mit Runde mit dem zweiten Parameter spielen, um Ihre Bedürfnisse zu erfüllen, aber Sie können nicht mit Decke, so dass Sie die Zahl ein wenig ändern müssen.

also in Ihrem Fall:

CEILING(@value * 4)/4 

tun sollten.


EDIT (dank @HABO):

Falls Ihre Handhabung negative Zahlen, bedenken Sie, dass dies immer noch rund bis (-10.3 wird -10.25 werden). Wenn Sie in diesem Fall abrunden müssen, damit es aussieht, wenn es positiv ist (d. H.Runde -10.3 zu -10.5), können Sie beide Fälle mit dieser Variante Griff:

SIGN(@value) * CEILING(ABS(@value) * 4)/4 

Weitere Überlegungen:

  • unten zum Vorquartal Zur Abrundung, ersetzen Sie einfach CEILING von FLOOR
+0

Decke akzeptiert nicht 2 Parameter, aber Danke für den Tipp. Ich werde versuchen, damit zu arbeiten. – KevinP

+0

Sie haben Recht. Ich werde meine Antwort bearbeiten, um sie in einem Moment korrekt anzupassen. – Pac0

+0

@KevinP: bearbeitet. – Pac0