2017/12/07
ORACLEには端数処理関数がいくつかあります。似た機能の関数もあります。正しく使い分けられていますか?
sponsored link
TRUNC・ROUND
TRUNCは、端数の切捨てを行う関数です。
ROUNDは、端数を四捨五入を行う関数です。(銀行丸めではないので注意)
1 2 3 4 5 6 7 8 |
SELECT a,TRUNC(a),ROUND(a) FROM test_table; A TRUNC(A) ROUND(A) ---------- ---------- ---------- 5.4 5 5 5.5 5 6 -5.4 -5 -5 -5.5 -5 -6 |
CEIL・FLOOR
CEILは、端数の切上げを行う関数です。負数の場合に注意、大きい方へ丸めます。
FLOORは、端数の切捨てを行う関数です。負数の場合に注意、小さい方へ丸めます。
1 2 3 4 5 6 7 8 |
SELECT a,CEIL(a),FLOOR(a) FROM test_table; A CEIL(A) FLOOR(A) ---------- ---------- ---------- 5.4 6 5 5.5 6 5 -5.4 -5 -6 -5.5 -5 -6 |
TRUNC・ROUNDとCEIL・FLOORの違い
違いの1点目は、TRUNCとROUNDは、指定した桁位置で端数処理をすることが出来るのに対し、CEIL・FLOORは整数に丸めることしかできない点です。
TRUNCとROUNDの桁位置の指定は、2番目の引数で行います。0は整数に(デフォルト)、1は小数点以下1位に、-1は整数10の位に丸めることを意味します。
1 2 3 4 5 |
SELECT a,TRUNC(a),TRUNC(a,0),TRUNC(a,1),TRUNC(a,-1) FROM test_table; A TRUNC(A) TRUNC(A,0) TRUNC(A,1) TRUNC(A,-1) ---------- ---------- ------------ ------------ ------------ 55.55 55 55 55.5 50 |
違いの2点目は、TRUNCとFLOORの違いです。指定した桁で丸められか否かという点以外に、負数の場合の扱いが異なります。
TRUNCは、指定した値を0に近い方へ丸めます。
FLOORは、指定した値を小さい方へ丸めます。
1 2 3 4 5 6 |
SELECT a,TRUNC(a),FLOOR(a) FROM test_table; A TRUNC(A) FLOOR(A) ---------- ---------- ---------- 5.5 5 5 -5.5 -5 -6 |
負数の場合のTRUNCとFLOORの違いやCEILの挙動は、特に注意が必要です。
まとめ
端数処理は金額等の重要な項目で使用することも多く、重い障害につながる可能性があります。
ぜひ覚えておきましょう。
関連