TRUNC Function
The TRUNC function can reduce the precision of its first numeric, DATE, or DATETIME argument by returning the truncated value. If the first argument is neither a number nor a point in time, it must be cast to a numeric, DATE, or DATETIME data type.
The TRUNC function can reduce the precision of its first numeric, DATE, or DATETIME argument by returning the truncated value. If the first argument is neither a number nor a point in time, it must be cast to a numeric, DATE, or DATETIME data type.
- For numeric expressions, TRUNC replaces with zero any digits less than the specified precision.
- For DATE or DATETIME expressions, TRUNC replaces any time
units smaller than the format specification with
1
for month or day time units, or with0
for time units smaller than day.
- When the first argument is a numeric expression, the second argument
must be an integer in the range from -32 to +32 inclusive, specifying
the position (relative to the decimal point) of the last significant
digit of the returned value. If you omit the factor specification
when the first argument is numeric, TRUNC returns the value
of the first argument truncated to a scale of zero, or to the units
place. Positive digit values specify truncation to the right of the decimal point; negative digit values specify truncation to the left, as Examples of negative, zero, and positive truncation factors shows.The following example calls the TRUNC function with a column expression that returns a numeric value in a SELECT statement. This statement displays the order number and truncated total price of items whose total price (truncated to the default scale of zero decimal places) is equal to $124.00.
SELECT order_num , TRUNC(total_price) FROM items WHERE TRUNC(total_price) = 124.00;
If a MONEY data type is the argument in a call to the TRUNC function that specifies a scale of zero, the fractional part becomes.00
in the returned value. For example, the following SELECT statement truncates 125.46 and a MONEY column value. It returns 125 and a truncated price in the formxxx.00
for each row in the items table.SELECT TRUNC(125.46), TRUNC(total_price) FROM items;
- When the first argument to TRUNC is a DATETIME expression,
the second argument must be a quoted string that specifies the smallest
significant time unit in the returned value. Only the following format
strings are valid as the second argument:
Table 1. Format strings for DATETIME arguments to the TRUNC function Format String Effect on Returned Value ' YEAR
'Truncated to the beginning of the year. The month, day, hour, and minute values truncate to 01-01 00:00
.' MONTH
'Truncated to the beginning of the first day of the month. The hour and minute values round to 00:00
.' DD
'Truncated to the beginning ( 00:00
= midnight) of the same day.' DAY
'If the first argument is a Sunday, midnight ( 00:00
) on that date is returned. For any other day of the week, midnight on the previous Sunday is returned.' HH
'Truncated to the beginning of the hour. The minute value truncates to zero. ' MI
'Truncated to the beginning of the nearest minute. As for all of these format strings, time units smaller than minute are discarded. If you omit the format string specification after an initial DATETIME expression argument, the returned value is the value of the first argument truncated to the day, as if you had specified
'DD'
as the format string.Examples that follow invoke the TRUNC function with a column expression that returns a DATETIME YEAR TO FRACTION(5) value in a SELECT statement. In these examples, table mytab has only a single row, and in that row the value of mytab.col_dt is
2006-12-07 14:30:12.12300
.This query specifies'YEAR'
as the DATETIME format string:SELECT TRUNC(col_dt, 'YEAR') FROM mytab;
The value returned is2006-01-01 00:00
.The next query resembles the previous query, but casts the truncated value to a DATE data type:SELECT TRUNC(col_dt, 'YEAR')::DATE FROM mytab;
The value returned is01/01/2006
.This example specifies'MONTH'
as the DATETIME format string:SELECT TRUNC(col_dt, 'MONTH') FROM mytab;
The value returned is2006-12-01 00:00
.The following example truncates the DATETIME expression to YEAR TO HOUR precision:SELECT TRUNC(col_dt, 'HH') FROM mytab;
The value returned is2006-12-07 14:00
. - When the first argument is a DATE expression, the second argument
should generally be a quoted string that specifies the smallest time
unit in the returned value. These are the same format strings as for
truncating DATETIME values, except that
'HH'
and'MI'
are not valid for dates, and there is no default format string for truncating DATE expression arguments.To return formatted DATE values, you must use one of the following quoted strings as the second argument to the TRUNC function:
Table 2. Format strings for DATE arguments to the TRUNC function Format String Effect on Returned Value ' YEAR
'Truncated to the beginning of the year. The month and day values are each 01
.' MONTH
'Truncated to the beginning of the month. The day value is 01
.' DD
'The DATE value of the first date_expression argument is returned. ' DAY
'If the first argument is a Sunday, that date is returned. For any other day of the week, the date of the previous Sunday is returned.
If you specify no format string as the second argument when the first argument is a DATE data type, no format string takes effect as the default. No error is issued, but the first argument is treated as numeric expression that evaluates to an integer, rather than as a DATE value. HCL OneDB™ stores DATE values internally as the integer count of days since 31 December 1899.
For example, the query SELECT ROUND(TODAY) FROM
systables
provides no format string for a DATE expression,
and returns the integer 39538
if the query is issued
on 1 April 2008.
SELECT TRUNC(TODAY, -2) FROM systables;
For
applications where integer dates like 39500
are unhelpful,
use the 'YEAR'
, 'MONTH'
, 'DAY
',
or 'DD'
format strings as the second argument to
the TRUNC function, to prevent the DATE expression from being
processed as if it were a number expression. On 1 April 2008, the
following query returns the DATE value 04/01/2008
if MDY4/
is
the setting of the DBDATE environment variable: SELECT TRUNC(TODAY, 'DD') FROM systables;
sprintf(query2, "%s",
"select trunc( ?::date, 'DAY') from mytab");
EXEC SQL prepare selectq from :query2;
EXEC SQL declare select_cursor cursor for selectq;
EXEC SQL open select_cursor using :hostvar_date_input;
EXEC SQL fetch select_cursor into :var_date_output;
For the order of precedence among the HCL OneDB environment variables that can specify the display and data entry formats for the built-in chronological data types, see the topic Precedence of DATE and DATETIME format specifications.
Note that the TRUNC function name is based on a use of the English word "truncate" that is different from its meaning in the TRUNCATE statement of SQL. The TRUNC function replaces the value of its first argument with another value that has a smaller precision or the same precision. The TRUNCATE statement deletes all of the rows from a database table, without dropping the table schema.