Oracle兼容性函数

Oracle兼容性函数

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

安装Oracle兼容性函数

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

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

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

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

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

注意:Oracle兼容性函数位于oracompat方案中。要访问它们,应该在前面加上方案名(oracompat)或者修改数据库搜索路径以包括该方案名。例如:
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函数:
    decode(expression, value, return [,value, return]...
                [, default])

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

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

    SELECT decode('M',true,false);
    CASE
    ------
     f
    (1 row)
    SELECT decode(1,'M',true,false);
    ERROR: Invalid input syntax for integer:"M" 
    LINE 1: SELECT decode(1,'M',true,false);
  • Oracle中bigint格式的数字会被显示为科学记数法,在Greenplum数据库中则不会:
    • Oracle中9223372036854775显示为9.2234E+15。
    • Greenplum数据库中9223372036854775仍为9223372036854775。
  • Oracle中默认的日期和时间戳格式与Greenplum中的默认格式不同。如果执行下列代码:
    CREATE TABLE TEST(date1 date, time1 timestamp, time2 
                      timestamp with timezone);
    INSERT INTO TEST VALUES ('2001-11-11','2001-12-13 
                     01:51:15','2001-12-13 01:51:15 -08:00');
    SELECT DECODE(date1, '2001-11-11', '2001-01-01') FROM TEST;

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

    注意:Oracle中能返回该行的正确语法是:
    SELECT DECODE(to_char(date1, 'YYYY-MM-DD'), '2001-11-11', 
                  '2001-01-01') FROM TEST

add_months

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

概要

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上的月数。这是一个整数或者任何能被隐式转换为整数的值。这个参数可以是正值或负值。
SELECT name, phone, nextcalldate FROM clientdb
WHERE nextcalldate >= add_months(CURRENT_DATE,6);

为所有nextcalldate是未来至少六个月之后的记录返回 namephonenextcalldate

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

bitand

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

概要

bitand(expr1, expr2)

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

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

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

注意:
  • BITAND的当前实现定义 n = 128。
  • PL/SQL支持一种 BITAND的重载,其输入和结果的类型都是 BINARY_INTEGER并且 n = 32。
expr1
一个非负整数表达式。
expr2
一个非负整数表达式。
SELECT bitand(expr1, expr2)
FROM ClientDB;

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

concat

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

概要

concat (string1, string2)

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

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

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

concat(CLOB, NCLOB) returns NCLOB
concat(NCLOB, NCHAR) returns NCLOB
concat(NCLOB, CHAR) returns NCLOB
concat(NCHAR, CLOB) returns NCLOB

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

string1/string2
两个要串接在一起的字符串。
string1string2都可以是数据类型CHARVARCHAR2NCHARNVARCHAR2CLOBNCLOB中的任意一种。
SELECT concat(concat(last_name, '''s job category is '),
     job_id)
FROM employees 

返回 'Smith's job category is 4B'

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

cosh

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

概要

cosh(float8)

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

注意:

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

float8
输入的数字
SELECT cosh(0.2)
FROM ClientDB;

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

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

decode

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

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

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

gptest=# select decode(a, 1, 'A', 2, 'B', 'C') from 
decodetest;
 case 
------
 C
 A
 C
 B
 C
(5 rows)

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

用户应该用case函数取代decode

概要

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

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

注意:

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

expression
要搜索的表达式。
value
要在表达式中寻找的值。
return
如果表达式匹配值应该返回什么。
default
如果表达式不匹配任何值应该返回什么。

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

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

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

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

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

SELECT CASE company_id
WHEN IS NOT DISTINCT FROM 1 THEN 'EMC'
WHEN IS NOT DISTINCT FROM 2 THEN 'Greenplum'
ELSE 'Other'
END
FROM suppliers;

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

表 1. 从8月1日开始的会计年度的月和季度
范围(字母) 范围(数字) 季度
8月 — 10月 8 — 10 Q1
11月 — 1月 11 — 1 Q2
2月 — 4月 2 — 4 Q3
5月 — 7月 5 — 7 Q4
该表包含一个数字域curr_month,它保存这一个月份的数字值1 – 12。有两种方式使用decode来得到季度:
  • 方法 1 - 在decode函数中包括12个值:
    SELECT decode(curr_month, 1, 'Q2',
                              2, 'Q3',
                              3, 'Q3',
                              4, 'Q3',
                              5, 'Q4',
                              6, 'Q4',
                              7, 'Q4',
                              8, 'Q1',
                              9, 'Q1',
                             10, 'Q1',
                             11, 'Q2',
                             12, 'Q2')
    FROM suppliers;
  • 方法 2 - 对decode使用一个定义一个唯一值的表达式:
    SELECT decode((1+MOD(curr_month+4,12)/3)::int, 1, 'Q1',
                                                   2, 'Q2',
                                                   3, 'Q3',
                                                   4, 'Q4',
    FROM suppliers;

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

PostgreSQL decode(与Oracle不兼容)

dump

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

概要

dump(expression [,integer]) 

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

expression
任意表达式
integer
返回的字符数
dump('Tech') returns 'Typ=96 Len=4: 84,101,99,104'

dump ('tech') returns 'Typ-96 Len=4: 84,101,99,104'

dump('Tech', 10) returns 'Typ=96 Len=4: 84,101,99,104'

dump('Tech', 16) returns 'Typ=96 Len=4: 54,65,63,68'

dump('Tech', 1016) returns 'Typ=96 Len=4 CharacterSet=US7ASCII:     54,65,63,68'

dump('Tech', 1017) returns 'Typ=96 Len=4 CharacterSet=US7ASCII:     T,e,c,h'

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

instr

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

概要

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

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

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

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

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

string
要搜索的串。
substring
要在string中搜索的字符串。
stringsubstring都可以是数据类型CHARVARCHAR2NCHARNVARCHAR2CLOB或者NCLOB中的任何一种。
position
position是一个非零整数,它表示string中的一个位置,搜索将从这个位置开始。如果没有指定,默认为1。如果这个值为负,该函数会从string的末尾倒着数position的绝对值个位置,然后搜索会从数到的位置开始。
occurrence
occurrence是一个整数,它表示应该搜索substring的第几次出现。occurrence的值必须为正。
positionoccurrence都必须是数据类型NUMBER或者任何可被隐式转换为NUMBER的数据类型,并且必须被解析成一个整数。positionoccurrence的默认值都是1,表示搜索从string的第一个字符开始查找substring的第一次出现。返回值是相对于string开头的位置,它与position的值无关,并且以字符数来表示。
SELECT instr('Greenplum', 'e') 
FROM ClientDB;

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

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

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

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

last_day

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

概要

last_day(date_expression) 

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

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

date_expression
用于计算月份最后一天的日期值。这可以是任何能被隐式转换为DATE的表达式。
SELECT name, hiredate, last_day(hiredate) "Option Date"
FROM employees;

返回namehiredatehiredate的月份的last_day,并且命名为" Option Date"。

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

listagg

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

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

概要

listagg(text) 

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

text
要被聚集到一个串中的文本值。
SELECT listagg(t) FROM (VALUES('abc'), ('def')) as l(t) 

返回:abcdef

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

listagg (2)

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

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

概要

listagg(text, separator) 

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

text
要被聚集到一个串中的文本值。
separator
用来分隔文本值的分隔符。
SELECT oracompat.listagg(t, '.') FROM (VALUES('abc'), 
('def')) as l(t)

返回:abc.def

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

lnnvl

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

概要

lnnvl(condition) 

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

condition
任何计算得到truefalse或者NULL的条件。
SELECT lnnvl(true) 

返回:false

SELECT lnnvl(NULL) 

返回:true

SELECT lnnvl(false) 

返回:true

SELECT (3=5)               

返回:true

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

months_between

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

概要

months_between(date_expression1, date_expression2)

这个Oracle兼容函数返回date_expression1date_expression2之间的月数。

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

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

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

date_expression1, date_expression2
用来计算月数的日期值。这可以是任何能被隐式转换为DATE的表达式。
SELECT months_between
    (to_date ('2003/07/01', 'yyyy/mm/dd'), 
    to_date ('2003/03/14', 'yyyy/mm/dd'));

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

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

返回hire_dateleave_date之间的月数。

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

nanvl

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

概要

nanvl(float1, float2)

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

float1
要求值的BINARY_FLOAT或者BINARY_NUMBER
float2
如果float1不是一个数字时要返回的值。
float1float2可以是任意数字数据类型或者任意能被隐式转换为数字数据类型的非数字数据类型。该函数用最高数字优先来决定参数,隐式转换其余参数为该数据类型,并且返回该数据类型。
SELECT nanvl(binary1, 0)
FROM MyDB;

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

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

next_day

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

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

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

概要

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是大小写无关的。
SELECT name, next_day(hiredate,"MONDAY") "Second Week Start"
FROM employees;

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

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

next_day (2)

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

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

概要

next_day(date_expression, days_to_add) 

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

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

date_expression
开始日期。这可以是任何能被隐式转换成DATE的表达式。
days_to_add
要被加到date_expression的天数。这是一个整数或者任何能被隐式转换为一个整数的值。这个参数可以是正值或者负值。
SELECT name, next_day(hiredate,90) "Benefits Eligibility 
Date"
FROM EMPLOYEES;

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

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

nlssort

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

概要

nlssort (variable, collation)

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

variable
要排序的数据。
collation
用于排序的排序规则。
CREATE TABLE test (name text);
INSERT INTO test VALUES('Anne'), ('anne'), ('Bob'), ('bob');
SELECT * FROM test ORDER BY nlssort(name, 'en_US.UTF-8');
 anne
 Anne
 bob
 Bob

SELECT * FROM test ORDER BY nlssort(name, 'C');
 Anne
 Bob
 anne
 bob 

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

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

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

nvl

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

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

概要

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_evaluatenull时要返回的值。

expression_to_evaluatenull_replacement_value都必须是同种数据类型。

SELECT nvl(contact_name,'None') 
FROM clients;
SELECT nvl(amount_past_due,0) 
FROM txns;
SELECT nvl(nickname, firstname) 
FROM contacts;

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

nvl2

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

概要

nvl2(expression_to_evaluate, non_null_replacement_value,
     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_evaluatenull时要返回的值。
select nvl2(unit_number,'Multi Unit','Single Unit') 
from clients;

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

decode

oracle.substr

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

概要

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

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

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

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

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

如果char_count小于1,返回空。

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

string
要从中进行抽取的字符串。
start
指定该字符串中的开始位置的整数。
char_count
指定要抽取的字符数的整数。
oracle.substr(name,1,15) 

返回name的前15个字符。

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

返回 "plum".

oracle.substr(name,2) 

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

PostgreSQL的substr(与Oracle不兼容)

reverse

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

概要

reverse (string)

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

string
输入字符串。
SELECT reverse('gnirts') 
FROM ClientDB;

返回 'string''

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

round

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

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

概要

round (date_time_expression, [unit_of_measure]) 

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

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

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

date_time_expression
要圆整的日期。这可以是能被隐式转换成DATE或者TIMESTAMP的任意表达式。
unit_of_measure
圆整要应用的度量单位。如果没有指定,那么date_time_expression会被圆整到最近的日。合法的参数有:
表 2. 合法参数
单位 合法参数 舍入规则
Year SYYYY, YYYY, YEAR, SYEAR, YYY, YY, Y 7月1日之前的舍掉
ISO Year IYYY, IY, I  
Quarter Q 当季度第二个月的第16天之前的舍掉
Month MONTH, MON, MM, RM 当月的第16天之前的舍掉
Week WW 当年第一天对应的星期几
IW IW 该ISO年第一天对应的星期几
W W 当月第一天对应的星期几
Day DDD, DD, J 舍入到最近的一天
Start day of the week DAY, DY, D 舍入到最近的周开始日(周日)
Hour HH, HH12, HH24 舍入到下一个小时
Minute MI 舍入到下一分钟
SELECT round(TO_DATE('27-OCT-00','DD-MON-YY'), 'YEAR')
FROM ClientDB;

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

SELECT round('startdate','Q')
FROM ClientDB;

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

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

PostgreSQL round(与Oracle不兼容)

sinh

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

概要

sinh(float8)

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

注意:

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

float8
输入的数字。
SELECT sinh(3) 
FROM ClientDB;

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

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

tanh

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

概要

tanh(float8)

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

注意:

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

float8
输入的数字。
SELECT tanh(3)
FROM ClientDB;

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

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

trunc

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

注意:

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

概要

trunc(date_time_expression, [unit_of_measure]) 

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

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

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

date_time_expression
要截断的日期。这可以是能被隐式转换为DATE或者TIMESTAMP的任意表达式。
unit_of_measure
应用于截断的度量单位。如果没有指定,那么date__time_expression会被截断到最近的日子。合法的格式为:
表 3. 合法的格式参数
单位 合法参数
Year SYYYY, YYYY, YEAR, SYEAR, YYY, YY, Y
ISO Year IYYY, IY, I
Quarter Q
Month MONTH, MON, MM, RM
Week WW
IW IW
W W
Day DDD, DD, J
Start day of the week DAY, DY, D
Hour HH, HH12, HH24
Minute MI
SELECT TRUNC(TO_DATE('27-OCT-92','DD-MON-YY'), 'YEAR')
FROM ClientDB;

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

SELECT TRUNC(startdate,'Q')
FROM ClientDB;

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

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

PostgreSQL trunc(与Oracle不兼容)