SQL Zone is brought to you in partnership with:

I am the founder and CEO of Data Geekery GmbH, located in Zurich, Switzerland. With our company, we have been selling database products and services around Java and SQL since 2013. Ever since my Master's studies at EPFL in 2006, I have been fascinated by the interaction of Java and SQL. Most of this experience I have obtained in the Swiss E-Banking field through various variants (JDBC, Hibernate, mostly with Oracle). I am happy to share this knowledge at various conferences, JUGs, in-house presentations and on our blog. Lukas is a DZone MVB and is not an employee of DZone and has posted 233 posts at DZone. You can read more from them at their website. View Full User Profile

# Simulation of TRUNC() in Derby

05.21.2012
| 2032 views |

Derby is missing out a lot of functions from the set of functions that other databases usually provide. One example is the TRUNC(value, decimals) function. According to the Wikipedia, truncation can be achieved as such:

```-- trunc(x, n)
CASE WHEN x > 0
THEN
floor(power(10, n) * x) / power(10, n)
ELSE
ceil(power(10, n) * x) / power(10, n)
END
```

Unfortunately, there is no POWER(base, exponent) function in Derby either. But no problem, we can simulate that as well. Let’s consider the Wikipedia again and we’ll find:

`power(b, x) = exp(x * ln(b))`

If we substitute that into the original simulation, we get for Derby:

```-- trunc(x, n)
CASE WHEN x > 0
THEN
floor(exp(n * ln(10)) * x) / exp(n * ln(10))
ELSE
ceil(exp(n * ln(10)) * x) / exp(n * ln(10))
END
```

Verbose, probably quite inefficient, but effective! Let’s run a short test, too:

```create table test (x numeric(10, 5), n int);

insert into test values (11.111, 0);
insert into test values (11.111, 1);
insert into test values (11.111, 2);
insert into test values (11.111, -1);

select
x, n,
case when x >= 0
then
floor(exp(n * ln(10)) * x) / exp(n * ln(10))
else
ceil(exp(n * ln(10)) * x) / exp(n * ln(10))
end "trunc(x, n)"
from test;
```

The above yields

X N TRUNC(X, N)
11.111 0 11
11.111 1 11.1
11.111 2 11.11
11.111 -1 10

Published at DZone with permission of Lukas Eder, author and DZone MVB. (source)

(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)