TRUNC 函数

通过返回截断的值,TRUNC 函数可降低它的第一个数值的、DATE 或 DATETIME 参数的精度。如果第一个参数既不是数值也不是时间点,则必须将它强制转型为数值、DATE 或 DATETIME 数据类型。

通过返回截断的值,TRUNC 函数可降低它的第一个数值的、DATE 或 DATETIME 参数的精度。如果第一个参数既不是数值也不是时间点,则必须将它强制转型为数值、DATE 或 DATETIME 数据类型。

TRUNC 函数与 ROUND 函数相似,但它截断(而不是舍入到最近的整数)第一个参数中小于它的第二个参数指定的精度之内的最小有效数字或时间单位的任何部分。
  • 对于数值表达式,TRUNC 以零替换小于指定精度的任何数字。
  • 对于 DATE 或 DATETIME 表达式,TRUNC 替换小于格式规范的任何时间单位,以 1 替换 monthday 时间单位,或以 0 替换小于 day 的时间单位。
TRUNC 函数可接受指定返回的值的精度的可选的第二个参数。
  • 当第一个参数为数值的表达式时,第二个参数必须为取值范围从 -32 至 +32(包含-32 和 +32)的整数,指定返回的值的最后有效数字(相对于小数点)的位置。当第一个参数为数值时,如果您省略 factor 规范,则 TRUNC 返回截断到个位或单位位置的第一个参数的值。
    正的数字值指定截断到小数点的右边;负的数字值指定截断到左边,如 图 1 所示。

    图: 负的、零和正的截断因子的示例


    开始图描述 - 围绕的文本描述此图 - 终止图描述
    下列示例在 SELECT 语句中以返回数值值的列表达式调用 TRUNC 函数。此语句显示订单号以及其总价(截断到缺省的个位小数位置)等于 $124.00 的项的被截断的总价。
    SELECT order_num , TRUNC(total_price) FROM items
                        WHERE TRUNC(total_price) = 124.00;
    如果在一个指定个位的 TRUNC 函数调用中,如果 MONEY 数据类型是参数,则在返回的值中小数部分成为 .00。例如,下列 SELECT 语句截断 125.46 和 MONEY 列值。它为 items 表中的每一行返回 125 以及形如 xxx.00 的截断的价格。
    SELECT TRUNC(125.46), TRUNC(total_price) FROM items;
  • TRUNC 的第一个参数为 DATETIME 表达式时,第二个参数必须为指定返回值中最小有效时间单位的引用的字符串。仅下列格式的字符串是有效的第二个参数:
    表 1. TRUNC 函数的 DATETIME 参数的格式字符串
    格式字符串 对返回的值的影响
    'YEAR' 截断到年初。monthdayhourminute 值截断到 01-01 00:00
    'MONTH' 截断到该月的第一天之初。hourminute 值截断到 00:00
    'DD' 阶段到同一天之初(00:00 = 午夜)。
    'DAY' 如果第一个参数是星期天,则返回那天的午夜(00:00)。对于该星期的任何其他天,返回前一个星期天的午夜。
    'HH' 截断到该小时之初。minute 值截断为零。
    'MI' 截断到最近的分钟之初。对于所有这些格式字符串,丢弃小于 minute 的时间单位。

    如果您在初始的 DATETIME 表达式参数之后省略格式字符串规范,则返回的值是将第一个参数截断到天的值,就如同您指定了 'DD' 作为格式字符串一样。

    下列示例在 SELECT 语句中以返回 DATETIME YEAR TO FRACTION(5) 值的列表达式调用 TRUNC 函数。在这些示例中,表 mytab 仅有单个行,且在那行中 mytab.col_dt 的值是 2006-12-07 14:30:12.12300

    此查询指定 'YEAR' 作为 DATETIME 格式字符串:
    SELECT TRUNC(col_dt, 'YEAR') FROM mytab;
    返回的值为 2006-01-01 00:00
    下一查询与前一查询相似,但将截断的值强制转型为 DATE 数据类型:
    SELECT TRUNC(col_dt, 'YEAR')::DATE FROM mytab;
    返回的值为 01/01/2006
    此示例指定 'MONTH' 作为 DATETIME 格式字符串:
    SELECT TRUNC(col_dt, 'MONTH') FROM mytab;
    返回的值为 2006-12-01 00:00
    下列示例将 DATETIME 表达式截断到 YEAR TO HOUR 精度:
    SELECT TRUNC(col_dt, 'HH') FROM mytab;
    返回的值为 2006-12-07 14:00
  • 当第一个参数为 DATE 表达式时,第二个参数通常应为指定返回的值中最小时间单位的引用的字符串。 除了 'HH''MI' 不是有效的日期之外,这些是与截断 DATETIME 值相同的格式字符串,且对于截断 DATAE 表达式参数,没有缺省的格式字符串。

    要返回格式化的 DATE 值,您必须使用下列引用的字符串之一作为 TRUNC 函数的第二个参数:

    表 2. TRUNC 函数的 DATE 参数的格式字符串
    格式字符串 对返回的值的影响
    'YEAR' 截断到该年之初。monthday 值都为 01
    'MONTH' 截断到该月之初。day 值为 01
    'DD' 返回第一个 date_expression 参数的 DATE 值。
    'DAY' 如果第一个参数是星期天,则返回那天。对于该星期的任何其他天,返回前一星期天的日期。

当第一个元素为 DATE 数据类型时,如果您未指定格式字符串作为第二个参数,则没有格式字符串作为缺省值生效。不发出错误,但将第一个参数作为求值为整数的数值表达式处理,而不是作为 DATE 值。 GBase 8s 将 DATE 值作为自从 1899 年 12 月 31 日以来的整数天数在内部存储。

例如,查询 SELECT ROUND(TODAY) FROM systables 未为 DATE 表达式提供格式字符串,如果在 2008 年 4 月 1 日提交该查询,则返回整数 39538

如果您应用数值的格式规范作为第二个参数,则非负的数值对 DATE 值不起作用,但下列示例将返回的值的最后两位数值舍入为零:
SELECT TRUNC(TODAY, -2) FROM systables;
对于类似于 39500 这样的整数日期不适用的应用,请使用 'YEAR''MONTH''DAY' 或 'DD' 格式字符串作为 TRUNC 函数的第二个参数,来防止将 DATE 表达式作为数值表达式来处理。在 2008 年 4 月 1 日,如果 MDY4/DBDATE 环境变量的设置,下列查询返回 DATE 值 04/01/2008
SELECT TRUNC(TODAY, 'DD') FROM systables;
如果您正在使用主变量来在动态的 SQL 中存储截断的时间点值,且在准备时刻不知道第一个参数的数据类型,则 GBase 8s 假设 DATETIME 数据类型是 TRUNC 函数的第一个参数,并返回 DATETIME YEAR TO MINUTE 截断的值。在执行时刻,在准备该语句之后,如果为主变量提供 DATE 值,则发出错误 -9750。要防止发生此错误,您可通过使用强制转型为主变量指定数据类型,如此程序片断中所示:
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;
        

要了解 GBase 8s 环境变量之中的优先顺序,这些环境变量可为内建的按时间排序的数据类型指定显示和数据条目格式,请参阅主题 DATE 和 DATETIME 格式规范的优先顺序.

请注意,TRUNC 函数名称是基于英文单词 "truncate",这与在 SQL 的 TRUNCATE 语句中它的含义不同。TRUNC 以另一个更小精度或相同精度的值替代它的第一个参数的值。TRUNCATE 语句从数据库表删除所有行,而不删除表模式。