Oracle兼容性函数

本参考描述了Greenplum数据库中的Oracle兼容性SQL函数。这些函数的目标本是PostgreSQL。

上级主题: Greenplum数据库工具指南

安装Oracle兼容性函数

在使用任何Oracle兼容性函数之前,要对每个数据库运行一次安装脚本$GPHOME/share/postgresql/contrib/orafunc.sql。例如,要在数据库testdb中安装这些函数,应使用下列命令:

  1. $ psql -d testdb -f $GPHOME/share/postgresql/contrib/orafunc.sql

要卸载Oracle兼容性函数,可运行uinstall_orafunc.sql脚本:

  1. $GPHOME/share/postgresql/contrib/uninstall_orafunc.sql

下列函数默认就可用而不需要运行Oracle兼容性的安装器:

注意:Oracle兼容性函数位于oracompat方案中。要访问它们,应该在前面加上方案名(oracompat)或者修改数据库搜索路径以包括该方案名。例如:

  1. ALTER DATABASE db_name SET search_path = $user, public, oracompat;

如果用户更改了数据库搜索路径,就必须重启数据库。

Oracle和Greenplum的实现差异

这些兼容性函数在Greenplum数据库中的实现和Oracle的实现有一些不同。如果用户使用验证脚本,其输出可能不会与Oracle的完全相同。下面是其中一些差异:

  • Oracle会执行小数舍入,而Greenplum数据库不会:
    • 在Oracle中2.00会变成2。
    • 在Greenplum数据库中2.0.0仍是2.00。
  • 所提供的Oracle兼容性函数以不同的方式处理隐式类型转换。例如,使用decode函数:

    1. decode(expression, value, return [,value, return]...
    2. [, default])

    在比较之前,Oracle会自动把expression和每一个value转换为第一个value的数据类型。Oracle会自动把return转换为和第一个结果相同的数据类型。

    Greenplum实现限制return和default为同一种数据类型。如果value的数据类型能被转换成expression的数据类型,expression和value可以是不同的类型。这会被隐式完成。否则,decode会失败,并且报出一个invalid input syntax错误。例如:

    1. SELECT decode('M',true,false);
    2. CASE
    3. ------
    4. f
    5. (1 row)
    6. SELECT decode(1,'M',true,false);
    7. ERROR: Invalid input syntax for integer:"M"
    8. LINE 1: SELECT decode(1,'M',true,false);
  • Oracle中bigint格式的数字会被显示为科学记数法,在Greenplum数据库中则不会:

    • Oracle中9223372036854775显示为9.2234E+15。
    • Greenplum数据库中9223372036854775仍为9223372036854775。
  • Oracle中默认的日期和时间戳格式与Greenplum中的默认格式不同。如果执行下列代码:

    1. CREATE TABLE TEST(date1 date, time1 timestamp, time2
    2. timestamp with timezone);
    3. INSERT INTO TEST VALUES ('2001-11-11','2001-12-13
    4. 01:51:15','2001-12-13 01:51:15 -08:00');
    5. SELECT DECODE(date1, '2001-11-11', '2001-01-01') FROM TEST;

    Greenplum数据库会返回该行,但Oracle不会返回任何行。

    注意:Oracle中能返回该行的正确语法是:

    1. SELECT DECODE(to_char(date1, 'YYYY-MM-DD'), '2001-11-11',
    2. '2001-01-01') FROM TEST

Oracle兼容性函数参考

下面是Oracle兼容性函数。

add_months

bitand

concat

cosh

decode

dump

instr

last_day

listagg

listagg (2)

lnnvl

months_between

nanvl

next_day

next_day (2)

nlssort

nvl

nvl2

oracle.substr

reverse

round

sinh

tanh

trunc

add_months

把给定的月数加到一个给定日期的Oracle兼容函数。

概要

  1. add_months(date_expression, months_to_add)

这个Oracle兼容函数把months_to_add加到一个 date_expression之上,并且返回一个DATE。

如果date_expression指定的是当月的最后一天,或者如果结果月份的天数少于date_expression,那么返回值会是结果月份的最后一天。否则,date_expression是所在月份的几号,返回值也是其所在月份的几号。

date_expression

开始日期。这可以是任何能被隐式转换成DATE的表达式。

months_to_add

要加到date_expression上的月数。这是一个整数或者任何能被隐式转换为整数的值。这个参数可以是正值或负值。

  1. SELECT name, phone, nextcalldate FROM clientdb
  2. WHERE nextcalldate >= add_months(CURRENT_DATE,6);

为所有nextcalldate是未来至少六个月之后的记录返回 name、phone和nextcalldate。

这个命令与Oracle语法兼容,提供它是为了方便使用。

bitand

在两个非负值的二进制位上计算一个逻辑AND操作的Oracle兼容函数。

概要

  1. bitand(expr1, expr2)

这个Oracle兼容函数返回一个整数,它表示两个非负值(expr1和 expr2)的二进制位上的一次AND操作。当两个值相同时返回1。当两个值不同时返回0。这个函数只比较有效位。例如,在整数5(二进制101)和1(二进制001或1)上的AND操作只比较最右边的位,并且产生的结果值为1(二进制1)。

expr1和expr2的类型是NUMBER,而结果的类型是NUMBER。只要有一个参数是NULL,结果就是NULL。

参数必须处于范围-(2(n-1)) .. ((2(n-1))-1)中。如果一个参数超过这个范围,结果就是undefined。

注意:

  • BITAND的当前实现定义 n = 128。
  • PL/SQL支持一种 BITAND的重载,其输入和结果的类型都是 BINARY_INTEGER并且 n = 32。

expr1

一个非负整数表达式。

expr2

一个非负整数表达式。

  1. SELECT bitand(expr1, expr2)
  2. FROM ClientDB;

这个命令与Oracle语法兼容,提供它是为了方便使用。

concat

串接两个字符串在一起的Oracle兼容函数。

概要

  1. concat (string1, string2)

这个Oracle兼容函数把两个字符串(string1和 string2)串接在一起。

返回的字符串具有和string1相同的字符集。其数据类型取决于参数的数据类型。

在两种不同数据类型的串接中,返回的数据类型是其中能够得到无损转换的那一种。因此,如果一个参数是 LOB,那么返回值也是LOB。如果一个参数是一种国家的数据类型,那么返回值也是一种国家的数据类型。例如:

  1. concat(CLOB, NCLOB) returns NCLOB
  2. concat(NCLOB, NCHAR) returns NCLOB
  3. concat(NCLOB, CHAR) returns NCLOB
  4. concat(NCHAR, CLOB) returns NCLOB

这个函数等效于串接操作符(||)。

string1/string2

两个要串接在一起的字符串。

string1和string2都可以是数据类型CHAR、VARCHAR2、NCHAR、NVARCHAR2、CLOB或NCLOB中的任意一种。

  1. SELECT concat(concat(last_name, '''s job category is '),
  2. job_id)
  3. FROM employees

返回 ‘Smith’s job category is 4B’

这个命令与Oracle语法兼容,提供它是为了方便使用。

cosh

返回一个给定数字的双曲余弦的Oracle兼容函数。

概要

  1. cosh(float8)

这个Oracle兼容函数返回输入的8位浮点数(float8)的双曲余弦值。

注意:

这个函数默认就可用,不需要运行Oracle兼容性安装器就能访问这个函数。

float8

输入的数字

  1. SELECT cosh(0.2)
  2. FROM ClientDB;

返回 ‘1.02006675561908’’ (0.2的双曲余弦值)

这个命令与Oracle语法兼容,提供它是为了方便使用。

decode

把一个数据值转换成指定返回值的Oracle兼容函数。这个函数是实现一组CASE语句的一种方式。

注意: decode会被转换成一个Greenplum数据库中的保留字。如果用户想使用Postgres的两个参数的decode函数来编码之前编码为只有ASCII表达形式的二进制串,用户必须用完整带方案限定的语法调用它,即pg_catalog.decode(),或者把函数名包括在引号中”decode” ()。

注意: Greenplum对这个函数的实现把decode转换为case。

这会产生下列类型的输出:

  1. gptest=# select decode(a, 1, 'A', 2, 'B', 'C') from
  2. decodetest;
  3. case
  4. ------
  5. C
  6. A
  7. C
  8. B
  9. C
  10. (5 rows)

这也意味着如果用户用decode翻译用户的视角,用户将看到case表达式。

用户应该用case函数取代decode。

概要

  1. decode(expression, value, return [,value, return]...
  2. [, default])

这个Oracle兼容函数decode会在一个表达式中搜索值。如果该值被找到,该函数会返回指定的值。

注意:

这个函数默认就可用,不需要运行Oracle兼容性安装器就能访问这个函数。

expression

要搜索的表达式。

value

要在表达式中寻找的值。

return

如果表达式匹配值应该返回什么。

default

如果表达式不匹配任何值应该返回什么。

只有一个expression被传递给该函数。可以传递多个 value/return对。

default参数是可选的。如果没有指定 default并且如果expression不匹配任何传入的 value参数,decode会返回 null。Greenplum实现限制return和default要是相同的数据类型。如果value的数据类型能被转换成expression的数据类型, expression和value可以是不同的类型。这种转换会被隐式完成。否则,decode会出现一个invalid input syntax错误而失败。

在下面的代码中,decode为company_id搜索一个值并且为那个公司返回一个指定的值。如果company_id不是列出的值之一,会为它返回默认值Other。

  1. SELECT decode(company_id, 1, 'EMC',
  2. 2, 'Greenplum',
  3. 'Other')
  4. FROM suppliers;

下列代码使用CASE语句来产生和使用decode的例子相同的结果。

  1. SELECT CASE company_id
  2. WHEN IS NOT DISTINCT FROM 1 THEN 'EMC'
  3. WHEN IS NOT DISTINCT FROM 2 THEN 'Greenplum'
  4. ELSE 'Other'
  5. END
  6. FROM suppliers;

要把一个范围的值分配到一个单一返回值,要么传递该范围中每个值的表达式,要么传递对该范围中所有值都同样计算的表达式。例如,如果一个会计年度从8月1日开始,下表中显示了会计季度。

表 1. 从8月1日开始的会计年度的月和季度
范围(字母)范围(数字)季度
8月 — 10月8 — 10Q1
11月 — 1月11 — 1Q2
2月 — 4月2 — 4Q3
5月 — 7月5 — 7Q4

该表包含一个数字域curr_month,它保存这一个月份的数字值1 – 12。有两种方式使用decode来得到季度:

  • 方法 1 - 在decode函数中包括12个值:

    1. SELECT decode(curr_month, 1, 'Q2',
    2. 2, 'Q3',
    3. 3, 'Q3',
    4. 4, 'Q3',
    5. 5, 'Q4',
    6. 6, 'Q4',
    7. 7, 'Q4',
    8. 8, 'Q1',
    9. 9, 'Q1',
    10. 10, 'Q1',
    11. 11, 'Q2',
    12. 12, 'Q2')
    13. FROM suppliers;
  • 方法 2 - 对decode使用一个定义一个唯一值的表达式:

    1. SELECT decode((1+MOD(curr_month+4,12)/3)::int, 1, 'Q1',
    2. 2, 'Q2',
    3. 3, 'Q3',
    4. 4, 'Q4',
    5. FROM suppliers;

这个命令与Oracle语法兼容,提供它是为了方便使用。

PostgreSQL decode(与Oracle不兼容)

dump

返回一个文本值的Oracle兼容函数,该文本值包括该表达式的数据类型代码、以字节计的长度和内部表示。

概要

  1. dump(expression [,integer])

这个Oracle兼容函数返回一个文本值,该文本值包括该表达式的数据类型代码、以字节计的长度和内部表示。

expression

任意表达式

integer

返回的字符数

  1. dump('Tech') returns 'Typ=96 Len=4: 84,101,99,104'
  2. dump ('tech') returns 'Typ-96 Len=4: 84,101,99,104'
  3. dump('Tech', 10) returns 'Typ=96 Len=4: 84,101,99,104'
  4. dump('Tech', 16) returns 'Typ=96 Len=4: 54,65,63,68'
  5. dump('Tech', 1016) returns 'Typ=96 Len=4 CharacterSet=US7ASCII: 54,65,63,68'
  6. dump('Tech', 1017) returns 'Typ=96 Len=4 CharacterSet=US7ASCII: T,e,c,h'

这个命令与Oracle语法兼容,提供它是为了方便使用。

instr

返回一个子串在串中位置的Oracle兼容函数。

概要

  1. instr(string, substring, [position[,occurrence]])

这个Oracle兼容函数在一个string中搜索一个substring。如果找到,它返回指示substring在string中位置的整数;如果没有找到,该函数返回0。

可选地,可以指定搜索从字符串中给定的position开始,并且只返回substring在string中的第occurrence次出现。

instr 使用输入字符集定义的字符计算字符串。

被返回的值是NUMBER数据类型。

string

要搜索的串。

substring

要在string中搜索的字符串。

string和substring都可以是数据类型CHAR、VARCHAR2、NCHAR、NVARCHAR2、CLOB或者NCLOB中的任何一种。

position

position是一个非零整数,它表示string中的一个位置,搜索将从这个位置开始。如果没有指定,默认为1。如果这个值为负,该函数会从string的末尾倒着数position的绝对值个位置,然后搜索会从数到的位置开始。

occurrence

occurrence是一个整数,它表示应该搜索substring的第几次出现。occurrence的值必须为正。

position和occurrence都必须是数据类型NUMBER或者任何可被隐式转换为NUMBER的数据类型,并且必须被解析成一个整数。position和occurrence的默认值都是1,表示搜索从string的第一个字符开始查找substring的第一次出现。返回值是相对于string开头的位置,它与position的值无关,并且以字符数来表示。

  1. SELECT instr('Greenplum', 'e')
  2. FROM ClientDB;

返回3,’e’的第一次出现

  1. SELECT instr('Greenplum', 'e',1,2)
  2. FROM ClientDB;

返回4,’e’的第二次出现

这个命令与Oracle语法兼容,提供它是为了方便使用。

last_day

返回在一个给定月份中最后一天的Oracle兼容函数。

概要

  1. last_day(date_expression)

这个Oracle兼容函数返回由date_expression指定的月份的最后一天。

返回类型总是DATE,与date_expression的日期类型无关。

date_expression

用于计算月份最后一天的日期值。这可以是任何能被隐式转换为DATE的表达式。

  1. SELECT name, hiredate, last_day(hiredate) "Option Date"
  2. FROM employees;

返回name、hiredate和hiredate的月份的last_day,并且命名为” Option Date”。

这个命令与Oracle语法兼容,提供它是为了方便使用。

listagg

把文本值聚集成一个串的Oracle兼容函数。

注意: 这个函数是一个重载函数。有两个Oracle兼容的listagg函数,一个要单一参数(要被聚集的文本,见下文),另一个要两个参数(要被聚集的文本和定界符,见下一页)。

概要

  1. listagg(text)

这个Oracle兼容函数会把文本值聚集成一个串。

text

要被聚集到一个串中的文本值。

  1. SELECT listagg(t) FROM (VALUES('abc'), ('def')) as l(t)

返回:abcdef

这个命令与Oracle语法兼容,提供它是为了方便使用。

listagg (2)

把文本值聚集成一个串的Oracle兼容函数,文本值之间用第二个参数指定的定界符分隔。

注意: 这个函数是一个重载函数。有两个Oracle兼容的listagg函数,一个要单一参数(要被聚集的文本,见上一页),另一个要两个参数(要被聚集的文本和定界符,见上文)。

概要

  1. listagg(text, separator)

这个Oracle兼容函数把文本值聚集成一个字符串,每个都用第二个参数(separator)中指定的分隔符分隔。

text

要被聚集到一个串中的文本值。

separator

用来分隔文本值的分隔符。

  1. SELECT oracompat.listagg(t, '.') FROM (VALUES('abc'),
  2. ('def')) as l(t)

返回:abc.def

这个命令与Oracle语法兼容,提供它是为了方便使用。

lnnvl

如果参数为假或者NULL就返回true的Oracle兼容函数,否则返回false。

概要

  1. lnnvl(condition)

这个Oracle兼容函数有一个参数作为条件,如果条件为假或者NULL这个函数返回true,如果条件为真这个函数返回false。

condition

任何计算得到true、false或者NULL的条件。

  1. SELECT lnnvl(true)

返回:false

  1. SELECT lnnvl(NULL)

返回:true

  1. SELECT lnnvl(false)

返回:true

  1. SELECT (3=5)

返回:true

这个命令与Oracle语法兼容,提供它是为了方便使用。

months_between

计算两个给定日期之间的月数的Oracle兼容函数。

概要

  1. months_between(date_expression1, date_expression2)

这个Oracle兼容函数返回date_expression1和date_expression2之间的月数。

如果date_expression1晚于date_expression2,则结果为正。

如果date_expression1早于date_expression2,则结果为负。

如果date_expression1和date_expression2是月份中相同的一日或者都是各自月份中的最后一日,那么结果总是一个整数。否则该函数会基于一个有31天的月来计算小数部分。

date_expression1, date_expression2

用来计算月数的日期值。这可以是任何能被隐式转换为DATE的表达式。

  1. SELECT months_between
  2. (to_date ('2003/07/01', 'yyyy/mm/dd'),
  3. to_date ('2003/03/14', 'yyyy/mm/dd'));

返回 July 1, 2003 和 March 14, 2014 之间的月数。

  1. SELECT * FROM employees
  2. where months_between(hire_date, leave_date) <12;

返回hire_date和leave_date之间的月数。

这个命令与Oracle语法兼容,提供它是为了方便使用。

nanvl

在碰到一个非数字值时将一个浮点数替换成一个值的Oracle兼容函数。

概要

  1. nanvl(float1, float2)

这个Oracle兼容函数求一个浮点数(float1,例如BINARY_FLOAT或者BINARY_DOUBLE)的值。如果它是一个非数字(’not a number’,NaN),该函数返回float2。这个函数最常被用来把非数字值转换为NULL或者0。

float1

要求值的BINARY_FLOAT或者BINARY_NUMBER。

float2

如果float1不是一个数字时要返回的值。

float1和float2可以是任意数字数据类型或者任意能被隐式转换为数字数据类型的非数字数据类型。该函数用最高数字优先来决定参数,隐式转换其余参数为该数据类型,并且返回该数据类型。

  1. SELECT nanvl(binary1, 0)
  2. FROM MyDB;

如果binary1域包含一个非数字值,返回0。否则,它会返回binary1的值。

这个命令与Oracle语法兼容,提供它是为了方便使用。

next_day

这个Oracle兼容函数返回一个日期后面下一个指定的星期几所对应的日期。

这一节描述用一个字符串参数来使用这个函数,用一个整数参数使用这个函数的细节请见下一节。

注意: 这个函数是一个重载函数。有两个Oracle兼容的next_day函数,一个要求一个日期和一个星期几作为其参数(见下文),另一个要求一个日期和一个整数作为其参数(见下一节)。

概要

  1. next_day(date_expression, day_of_the_week)

这个Oracle兼容函数返回在date_expression之后发生的第一个day_of_the_week(Tuesday、Wednesday等等)。

星期几必须用英文指定。

星期几的大小写没有关系。

返回类型总是DATE,它与date_expression的数据类型无关。

date_expression

开始日期。这可以是任何能被隐式转换成DATE的表达式。

day_of_the_week

一个包含星期几的英文字符串,例如’Tuesday’。day_of_the_week是大小写无关的。

  1. SELECT name, next_day(hiredate,"MONDAY") "Second Week Start"
  2. FROM employees;

返回name以及hiredate之后的下一个星期一的date(标记为”Second Week Start”)。

这个命令与Oracle语法兼容,提供它是为了方便使用。

next_day (2)

这个Oracle兼容函数把给定天数加到一个日期并且返回下一天的日期。

注意: 这个函数是一个重载函数。有两个Oracle兼容的next_day函数,一个要求一个日期和一个星期几作为其参数(见上一节),另一个要求一个日期和一个整数作为其参数(见下文)。

概要

  1. next_day(date_expression, days_to_add)

这个Oracle兼容函数把days_to_add的数字加到date_expression并且返回结果之后一天的日期。

返回类型总是DATE,它与date_expression的数据类型无关。

date_expression

开始日期。这可以是任何能被隐式转换成DATE的表达式。

days_to_add

要被加到date_expression的天数。这是一个整数或者任何能被隐式转换为一个整数的值。这个参数可以是正值或者负值。

  1. SELECT name, next_day(hiredate,90) "Benefits Eligibility
  2. Date"
  3. FROM EMPLOYEES;

返回name以及从hiredate开始90天之后的日期(标记为”Benefits Eligibility Date”)。

这个命令与Oracle语法兼容,提供它是为了方便使用。

nlssort

根据指定排序规则排序数据的Oracle兼容函数。

概要

  1. nlssort (variable, collation)

这个Oracle兼容函数根据一个指定排序规则排序数据。

variable

要排序的数据。

collation

用于排序的排序规则。

  1. CREATE TABLE test (name text);
  2. INSERT INTO test VALUES('Anne'), ('anne'), ('Bob'), ('bob');
  3. SELECT * FROM test ORDER BY nlssort(name, 'en_US.UTF-8');
  4. anne
  5. Anne
  6. bob
  7. Bob
  8. SELECT * FROM test ORDER BY nlssort(name, 'C');
  9. Anne
  10. Bob
  11. anne
  12. bob

在第一个例子中指定的是UTF-8排序规则。这会把字符进行分组而不考虑其大小写。

在第二个例子中指定的是ASCII (C) 排序规则。这会根据ASCII顺序排序。其结果是大写字符被排在小写字符之前。

这个命令与Oracle语法兼容,提供它是为了方便使用。

nvl

当一个表达式计算为null时将其替换为指定值的Oracle兼容函数。

注意: 这个函数和PostgreSQL的coalesce函数类似。

概要

  1. nvl(expression_to_evaluate, null_replacement_value)

这个Oracle兼容函数会计算expression_to_evaluate。如果它是null,该函数返回null_replacement_value;否则它返回expression_to_evaluate。

expression_to_evaluate

要计算的表达式。

null_replacement_value

如果expression_to_evaluate时null时要返回的值。

expression_to_evaluate和null_replacement_value都必须是同种数据类型。

  1. SELECT nvl(contact_name,'None')
  2. FROM clients;
  3. SELECT nvl(amount_past_due,0)
  4. FROM txns;
  5. SELECT nvl(nickname, firstname)
  6. FROM contacts;

这个命令与Oracle语法兼容,提供它是为了方便使用。

nvl2

为空值和非空值返回可替代值的Oracle兼容函数。

概要

  1. nvl2(expression_to_evaluate, non_null_replacement_value,
  2. null_replacement_value)

这个Oracle兼容函数计算expression_to_evaluate。如果它不是null,该函数返回non_null_replacement_value;否则它返回null_replacement_value。

expression_to_evaluate

要计算的表达式。

non_null_replacement_value

如果expression_to_evaluate不是null时要返回的值。

null_replacement_value

如果expression_to_evaluate是null时要返回的值。

  1. select nvl2(unit_number,'Multi Unit','Single Unit')
  2. from clients;

这个命令与Oracle语法兼容,提供它是为了方便使用。

decode

oracle.substr

这个Oracle兼容函数抽取一个字符串的一部分。

概要

  1. oracle.substr(string, [start [,char_count]])

这个Oracle兼容函数抽取一个字符串的一部分。

如果start是0,它被计算为1。

如果start是负值,开始位置是从字符串的末尾向前移动start个字符的位置。

如果char_count没有被传递给该函数,从开始位置到字符串末尾的所有字符都会被返回。

如果char_count小于1,返回空。

如果start或者char_count是一个数字但不是一个整数,它们的值会被分解成整数。

string

要从中进行抽取的字符串。

start

指定该字符串中的开始位置的整数。

char_count

指定要抽取的字符数的整数。

  1. oracle.substr(name,1,15)

返回name的前15个字符。

  1. oracle.substr("Greenplum",-4,4)

返回 “plum”.

  1. oracle.substr(name,2)

从第二个字符开始,返回name的所有字符。

PostgreSQL的substr(与Oracle不兼容)

reverse

以逆序返回输入字符串的Oracle兼容函数。

概要

  1. reverse (string)

这个Oracle兼容函数以逆序返回输入字符串(string)。

string

输入字符串。

  1. SELECT reverse('gnirts')
  2. FROM ClientDB;

返回 ‘string’’

这个命令与Oracle语法兼容,提供它是为了方便使用。

round

把一个日期取整到一个指定度量单位(日、周等等)的Oracle兼容函数。

注意: 这个函数是一个重载函数。它与Postgres的This function is an overloaded function. It shares the same name with the Postgres round数学函数共享相同的名称,后者把数字输入圆整到最近的整数或者最近的x个小数位(可选)。

概要

  1. round (date_time_expression, [unit_of_measure])

这个Oracle兼容函数把date_time_expression圆整到最近的unit_of_measure(日、周等等)。如果没有指定unit_of_measure,date_time_expression会被圆整到最近的日。它根据格里高利历的规则操作。

如果date_time_expression的数据类型是TIMESTAMP,返回值总是数据类型TIMESTAMP。

如果date_time_expression的数据类型是DATE,返回值总是数据类型DATE。

date_time_expression

要圆整的日期。这可以是能被隐式转换成DATE或者TIMESTAMP的任意表达式。

unit_of_measure

圆整要应用的度量单位。如果没有指定,那么date_time_expression会被圆整到最近的日。合法的参数有:

表 2. 合法参数
单位合法参数舍入规则
YearSYYYY, YYYY, YEAR, SYEAR, YYY, YY, Y7月1日之前的舍掉
ISO YearIYYY, IY, I 
QuarterQ当季度第二个月的第16天之前的舍掉
MonthMONTH, MON, MM, RM当月的第16天之前的舍掉
WeekWW当年第一天对应的星期几
IWIW该ISO年第一天对应的星期几
WW当月第一天对应的星期几
DayDDD, DD, J舍入到最近的一天
Start day of the weekDAY, DY, D舍入到最近的周开始日(周日)
HourHH, HH12, HH24舍入到下一个小时
MinuteMI舍入到下一分钟
  1. SELECT round(TO_DATE('27-OCT-00','DD-MON-YY'), 'YEAR')
  2. FROM ClientDB;

返回 ‘01-JAN-01’ (27 Oct 00 被舍入成接下来一年的第一天(YEAR))

  1. SELECT round('startdate','Q')
  2. FROM ClientDB;

返回 ‘01-JUL-92’ (startdate被舍入成该季度(Q)的第一天)

这个命令与Oracle语法兼容,提供它是为了方便使用。

PostgreSQL round(与Oracle不兼容)

sinh

返回一个给定数字的双曲正弦值的Oracle兼容函数。

概要

  1. sinh(float8)

这个Oracle兼容函数返回输入的8位浮点数(float8)的双曲正弦值。

注意:

这个函数默认就可用,不需要运行Oracle兼容性安装器就能访问这个函数。

float8

输入的数字。

  1. SELECT sinh(3)
  2. FROM ClientDB;

返回’10.0178749274099’’(3的双曲正弦)

这个命令与Oracle语法兼容,提供它是为了方便使用。

tanh

返回一个给定数字的双曲正切值的Oracle兼容函数。

概要

  1. tanh(float8)

这个Oracle兼容函数返回输入的8位浮点数(float8)的双曲正切值。

注意:

这个函数默认就可用,不需要运行Oracle兼容性安装器就能访问这个函数。

float8

输入的数字。

  1. SELECT tanh(3)
  2. FROM ClientDB;

返回’0.99505475368673’’ (3的双曲正切)

这个命令与Oracle语法兼容,提供它是为了方便使用。

trunc

将一个日期截断到一种特定度量单位(日、周、小时等等)的Oracle兼容函数。

注意:

这个函数是一个重载函数。它与Postgres的 trunc以及Oracle的trunc算数函数共享相同的名称。这些函数都把数字输入截断到最近的整数或者可选地截断到最近的x个小数位置。

概要

  1. trunc(date_time_expression, [unit_of_measure])

这个Oracle兼容函数截断date_time_expression到最近的unit_of_measure(日、周等等)。如果没有指定unit_of_measure,date_time_expression会被截断到最近的日子。它会根据格里高利历的规则来操作。

如果date_time_expression的数据类型是TIMESTAMP,返回值的类型将总是数据类型TIMESTAMP且被截断到小时/分钟级别。

如果date_time_expression的数据类型是DATE,返回值的类型将总是数据类型DATE。

date_time_expression

要截断的日期。这可以是能被隐式转换为DATE或者TIMESTAMP的任意表达式。

unit_of_measure

应用于截断的度量单位。如果没有指定,那么date__time_expression会被截断到最近的日子。合法的格式为:

表 3. 合法的格式参数
单位合法参数
YearSYYYY, YYYY, YEAR, SYEAR, YYY, YY, Y
ISO YearIYYY, IY, I
QuarterQ
MonthMONTH, MON, MM, RM
WeekWW
IWIW
WW
DayDDD, DD, J
Start day of the weekDAY, DY, D
HourHH, HH12, HH24
MinuteMI
  1. SELECT TRUNC(TO_DATE('27-OCT-92','DD-MON-YY'), 'YEAR')
  2. FROM ClientDB;

返回 ‘01-JAN-92’ (27 Oct 92 被截断到该年的第一天(YEAR))

  1. SELECT TRUNC(startdate,'Q')
  2. FROM ClientDB;

返回 ‘1992-07-01’ (startdate被截断到该季度的第一天(Q),取决于date_style设置)

这个命令与Oracle语法兼容,提供它是为了方便使用。

PostgreSQL trunc(与Oracle不兼容)