postgresql常见数值,字符,日期类型常见函数总结

一.字符函数

 

函数描述例子
char_length(string)获取字符串中字符的个数test=> select char_length('abc123苏');
char_length 
-------------
          7
length(string)获取字符的数目.经过测试好像和char_length没有区别.test=> select length('abc123中国');
length 
--------
      8
convert()使用指定的转换名改变编码test=> select convert('aa','utf8','gbk');
convert 
---------
\x6161
lower/upper(strings)将字符串转换为小写/大写test=> select lower('ABC'),upper('abc');
lower | upper 
-------+-------
abc  | ABC
initcap(string)将字符串的第一个字母转换为大写,其它保留小写test=> select initcap('abc');
initcap 
---------
Abc
octet_length(string)返回字符串中的字节数test=> select octet_length('abc中国'),octet_length('abcdef');
octet_length | octet_length 
--------------+--------------
            9 |            6
position(strings in string)返回指定字符串的位置,如果没有则为0test=> select position('a'  in '123abc');
position 
----------
        4
strpos(str,str)获取指定字符串的位置,和position类似,不过参数顺序不一致test=> select strpos('abcdefgh','c');
strpos 
--------
      3
substr(string,int,int)抽取字符串中的指定位置的字符test=> select substr('abcdef',2,5);
substr 
--------
bcdef
(1 row)
substring抽取更多规则的子字符串,支持正则表达式,例如抽取字符串最后一个字符test=> select substring('abcdef','.$');
substring 
-----------
f
trim(string,string) 在字符串两边截取指定字符,可以是多个字符.默认为空字符test=> select trim('xyxtrimyyx', 'xyt');
btrim 
-------
rim
rtrim,ltrim在字符串的右边/左边删除指定的字符串test=> select rtrim('abcdefa','a'),ltrim('abcdefa','a');
rtrim  | ltrim  
--------+--------
abcdef | bcdefa
 
btrim(string,string)在字符串的两边删除指定的字符串,直到遇到一个不是指定的字符串为止.注意与trim的区别.经过测试和trim好像是一样的
lpad(string,int,string)/rpad在字符串的左边/右边填充字符串,使得字符串的长度达到指定长度.test=> select lpad('abc',10,'x'),rpad('abc',10,'x');
    lpad    |    rpad    
------------+------------
xxxxxxxabc | abcxxxxxxx
ascii(str)/chr(int)将字符串转换为ascii码,将ascii码转换成字符串test=> select ascii('a'),chr(97);
ascii | chr 
-------+-----
    97 | a
decode/encode将encode编码的strings转换为二进制/将二进制的编码转换为strings.注意和oracle中decode的区别.test=> select decode('b3NkYmEAAQ==','base64');
      decode      
------------------
\x6f73646261000
md5(string)获取字符串的md5值test=> select md5('brent');
              md5                
----------------------------------
fddd76411252e465ab9edde8ebed3d0a
quote_ident(string)返回适合于sql语句的标识符形式只有在必要的才会添加引号.一般用在有特殊字符的地方test=> select quote_ident('"ss'),quote_ident('abc'),quote_ident('abc\');
quote_ident | quote_ident | quote_ident 
-------------+-------------+-------------
"""ss"      | abc        | "abc\"
 
quote_literal(string)返回适用于sql语句中的文本形式test=> select quote_literal('"ss'),quote_literal('abc'),quote_literal('abc\');
quote_literal | quote_literal | quote_literal 
---------------+---------------+---------------
'"ss'        | 'abc'        | E'abc\\'
regxp_replace(strings,pattern,strings)匹配替换posix正则表达式的字符串test=> select regexp_replace('abc123efg','..[1-9]+','#');
regexp_replace 
----------------
a#efg
repeat(strings,int)将字符串重复N次test=> select repeat('abc',3);
  repeat  
-----------
abcabcabc
replace(str,str)将字符串替换成指定字符串.注意这里的字符串是连续的字符串,而不是按照字符进行替换test=> select replace('aaabbbccc','b','23');
  replace    
--------------
aaa232323ccc
translate(str,str)将字符串中的字符转换成指定字符,注意这里的是进行字符串的转换,和replace是不同的.test=> select translate('aaabbbccc','ab','xy'),replace('aaabbbccc','ab','xy');
translate |  replace  
-----------+-----------
xxxyyyccc | aaxybbccc
这里的例子中,translate只是将a转换成x,b转换成y,和replace完全不同
split_part(str,delimiter,int)根据delimiter截取,获取指定的part,有点像shell中的awk命令test=> select split_part('brent,no.1,93',',',2);
split_part 
------------
no.1
(1 row)
 
to_hex(int)将number转换为16进制test=> select to_hex(1000);
to_hex 
--------
3e8
(1 row)

 

 

 

 

二.数值函数

 

函数描述例子
ceil取整数,取大值test=> select ceil(35.7);
ceil 
------
  36
(1 row)
floor取整数,取小值test=> select floor(35.7);
floor 
-------
    35
 
round(numeric,int)四舍五入.后面的值为精度,如果后面的精度没有则取整test=> select round(36.12),round(36.567,2);
round | round 
-------+-------
    36 | 36.57
 
trunc(numeric,int)截断,后面的为精度,如果不设置精度则为取整,类似于floortest=> select trunc(32.567),trunc(32.567,2);
trunc | trunc 
-------+-------
    32 | 32.56
 
random()0.0到1.0之间的随机数test=> select random();
      random      
-------------------
0.679839549586177
 

 

 

 

 

三.日期函数

 

 

函数描述例子
age(timstamp,timestamp)返回一个时间差,例如年龄,第一个时间减去第二个时间.如果第一个参数不写,那么默认是当前时间,第二个参数需要格式为timestamp类型test=>  select age(timestamp '1987-10-15'),age('2018-09-16','1987-10-16');
          age          |      age        
------------------------+------------------
30 years 11 mons 1 day | 30 years 11 mons
clock_timestamp()实时时钟的当前时间戳.和current_timestamp的区别是,当开启一个事务后,current_timestamp是不变的表示事务的开启时间,而clock_timestamp()表示时钟时间,所以在一个sql语句中的clock时间也有可能是不同的.test=> begin;
BEGIN
test=> select current_timestamp,clock_timestamp();
      current_timestamp      |        clock_timestamp        
-------------------------------+-------------------------------
2018-09-16 10:45:53.653818+08 | 2018-09-16 10:46:04.311372+08
(1 row)

test=> select current_timestamp,clock_timestamp();
      current_timestamp      |        clock_timestamp        
-------------------------------+-------------------------------
2018-09-16 10:45:53.653818+08 | 2018-09-16 10:46:11.469315+08
(1 row)

test=> end;
COMMIT
statement_timestamp()当前语句执行的系统时间,在一个sql中的时间是一致的.可以看这个例子,同一个sql中,三个时间都不一致test=> select clock_timestamp(),clock_timestamp(),statement_timestamp();
        clock_timestamp        |        clock_timestamp        |      statement_timestamp      
-------------------------------+-------------------------------+-------------------------------
2018-09-16 11:33:59.982234+08 | 2018-09-16 11:33:59.982235+08 | 2018-09-16 11:33:59.982161+08
 
timeofday()等同于clock_timestamp(),但是返回的是一个text字符串test=> select timeofday();
              timeofday              
-------------------------------------
Sun Sep 16 10:51:58.989842 2018 CST
current_timestamp当前事务的开启时间戳.在一个事务内时间保持不变.带时区.还可以接一个参数,指定精度,该精度导致结果的秒数四舍五入到小数位.test=> select current_timestamp(0),current_timestamp;
  current_timestamp    |      current_timestamp      
------------------------+-------------------------------
2018-09-16 11:27:19+08 | 2018-09-16 11:27:19.112954+08
current_date当前事务的日期,在一个事务内日期不变 
current_time当前事务的时间,在一个事务内时间不变 
localtime等同于current_time,不带时区 
localtimestamp等同于current_timestamp,不带时区.还可以接一个参数,指定精度,该精度导致结果的秒数四舍五入到小数位.test=> select localtimestamp,localtimestamp(0);
      localtimestamp      |  localtimestamp    
----------------------------+---------------------
2018-09-16 11:26:37.935849 | 2018-09-16 11:26:38
now()等同于current_timestamp 
transaction_timestamp()等同于current_timestamp 
extract()获取子域test=> select now(),extract(year from now()),extract(month from now()),extract(day from now()),extract(minute from now()),extract(second from now());
              now              | date_part | date_part | date_part | date_part | date_part 
-------------------------------+-----------+-----------+-----------+-----------+-----------
2018-09-16 11:08:25.431863+08 |      2018 |        9 |        16 |        8 | 25.431863
 
date_part(text,timestamp)获取子域,等同于extracttest=> select date_part('hour',now()),date_part('minute',now()),date_part('month',now());
date_part | date_part | date_part 
-----------+-----------+-----------
        11 |        10 |        9
date_trunc(text,timestamp)截断指定的精度test=> select date_trunc('day',current_timestamp),date_trunc('hour',current_timestamp);
      date_trunc      |      date_trunc      
------------------------+------------------------
2018-09-16 00:00:00+08 | 2018-09-16 11:00:00+08

EXTRACT和date_part函数的参数

说明示例
century世纪 
year 
decade年份/10 
millennium第几个千年,0-1000是1,1000-2000是2,2000-3000是3 
quarter第几季度 
month 
week第几个星期 
dow星期几,0是星期天... 
day本月的第几天 
doy本年的第几天 
hour得到时间中的小时 
minute得到时间中的分钟 
second得到时间中的秒 
epoch相对于1970-01-01 00:00:00以来的时间.test=> select date_part('epoch',now());
    date_part    
------------------
1537069799.45484
 
milliseconds秒域/毫秒数,即秒数乘以1000test=> select current_timestamp,extract(milliseconds from current_timestamp);
      current_timestamp      | date_part 
-------------------------------+-----------
2018-09-16 11:55:58.041867+08 | 58041.867
microseconds秒域/微秒数,即秒数乘以1000test=> select current_timestamp,extract(microseconds from current_timestamp);
      current_timestamp      | date_part 
-------------------------------+-----------
2018-09-16 11:56:26.533713+08 |  26533713
timezone时区偏移量(秒).+8就是8*3600=28800test=> select extract(timezone from current_timestamp);
date_part 
-----------
    28800
timezone_hour时区偏移量(小时),+8就是8test=> select extract(timezone_hour from current_timestamp);
date_part 
-----------
        8
timezone_minute时区偏移量的小时部分,整数都返回0test=> select extract(timezone_minute from current_timestamp);
date_part 
-----------
        0

 

总结:

1.如果是取事务时间,如果需要时区,一般用current_timestamp或者now(),current_timestamp的好处是可以去精度

2.如果是取事务时间,如果不需要时区,一般用localtimestamp.localtimestamp也可以取精度

3.如果是取每个语句执行的时间,则使用statement_timestamp()

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值