DB2常用函数
一、寄存器使用
使用方式:SYSIBM.SYSDUMMY1
、SYSIBM.DUAL
、values
使用示例:
SELECT 'hello db2' FROM SYSIBM.SYSDUMMY1;
SELECT 'hello db2' FROM SYSIBM.DUAL;
VALUES 'hello db2';
二、时间处理相关
1、日期与时间
SELECT CURRENT DATE FROM SYSIBM.DUAL; --使用寄存器方式
VALUES CURRENT DATE ; --查日期
VALUES CURRENT TIME ; --查时间
VALUES CURRENT TIMESTAMP; --查时间戳
2、年月日时分秒
年月日时分秒相关函数
YEAR() --获取年;
MONTH() --获取月;
DAY() --获取日;
HOUR() --获取小时;
MINUTE() --获取分钟;
SECOND() --获取秒;
DATE() --获取日期;
TIME() --获取时间;
TIMESTAMP() --获取时间戳。
示例:
--使用寄存器方式获取当前年份
SELECT YEAR(CURRENT DATE) FROM SYSIBM.DUAL;
--values方式获取当前月份
VALUES MONTH(CURRENT DATE) ;
--表示查当前月份的日志记录
select * from DBCM.LOGINFO L WHERE MONTH(L.OP_TIME)= MONTH(CURRENT DATE) and MONTH(L.OP_TIME) = MONTH(CURRENT DATE)
参数也可以是指定字符串
SELECT YEAR('2020-06-01') FROM SYSIBM.DUAL;
VALUES HOUR('2020-06-01 20:20:06') ;
3、年月日时分秒加减运行
还可以直接运行操作:要求加减带单位的时间长度。
VALUES TIMESTAMP('2020-06-01 22:18:12')+1 YEAR +1 MONTH +1 DAY +1 HOUR +1 MINUTE +1 SECOND ;
--结果:2021-07-02 23:19:13
VALUES TIMESTAMP('2020-05-30 21:18:12')-1 YEAR -1 MONTH -1 DAY -1 HOUR -1 MINUTE -1 SECOND ;
--结果:2019-04-29 20:17:11
--表示查询当前月份的英文名称
SELECT MONTHNAME(CURRENT date) FROM SYSIBM.DUAL;
以LOGINFO
表为例:
--查询今年上个月的日志
select * from DBCM.LOGINFO L WHERE YEAR(L.OP_TIME)= YEAR(CURRENT DATE) and MONTH(L.OP_TIME) =(MONTH(CURRENT DATE)-1 )
4、日期相关相关函数
WEEK() --判断时间年份及当前该年第几周
MONTHNAME() --获取月份英文名称
DAY() --判断时间是该月的第几天
DAYNAME() --判断传入时间是周几的英文名称
DAYOFYEAR() --判断传入时间是该年的第几天
DAYOFMONTH() --判断传入时间是该月的第几天
DAYOFWEEK() --判断传入时间是该周的第几天
days() --可以获取两个时间相差天数
使用示例:
WEEK()
:
VALUES week('2020-06-10') ; --结果:24,表示传入时间是2020年第24周
MONTHNAME()
:
VALUES MONTHNAME('2020-06-10') ; --结果:June
DAY()
:
VALUES day('2020-06-10') ; --结果:10,6月的第10天
DAYNAME()
:
VALUES DAYNAME('2020-06-10') ; --结果:Wednesday
DAYOFYEAR()
:
VALUES DAYOFYEAR('2020-06-10') ;--结果:162
DAYOFMONTH()
:
VALUES DAYOFMONTH('2020-06-10') ;--结果:10,6月的第10天
DAYOFWEEK()
:
VALUES DAYOFWEEK('2020-06-10') ;--结果:4, 默认一周日为第一天,周三是第4天
VALUES DAYOFWEEK('2020-06-14') ;--结果:1
DAYOFWEEK_ISO()
:可以和DAYOFWEEK()
比较一下:
VALUES DAYOFWEEK_ISO('2020-06-10') ;--结果:3
VALUES DAYOFWEEK_ISO('2020-06-14') ;--结果:7
DAYS()
:
VALUES DAYS(CURRENT DATE)-DAYS(CURRENT DATE-10 DAY);
--结果:10 ,可以计算日期差多少天
values DAYNAME(current timestamp)
TIMESTAMPDIFF
:
TIMESTAMPDIFF(n,CHAR(TIMESTAMP('2012-05-25 10:23:24')-TIMESTAMP('2012-05-25 10:20:24')))
根据两个时间戳记之间的时差,返回由第一个参数定义的类型表示的估计时差。(整除部分,不会四舍五入)其中n的含义如下:
n=2:秒 ; n=4 :分; n=8:时;
n=16 :天; n=32 :周;
n=64:月; n=128 :季度; n=256:年;
使用示例:
VALUES TIMESTAMPDIFF(16, char(TIMESTAMP('2020-06-14 12:12:12')-TIMESTAMP('2020-06-10 12:12:12')));
--结果:4 ,表示相差4天
4、时间的格式
ISO,使用国际标准组织(ISO)制订的日期和时间格式;USA,使用美国日期和时间的 IBM 标准格式。
values char(current date,iso); --2020-06-10
values char(current date,usa); --06/10/2020
values char(current time,iso); --18.08.53
三、字符串函数
1、日期时间转换
(1)TO_CHAR()
把时间转换成指定格式的字符串类型。低版本DB2
不支持。
“YYYY-MM-DD HH:MI:SS”
十二小时制;
“YYYY-MM-DD HH24:MI:SS”
二十四小时制。
SELECT TO_CHAR(TIMESTAMP('2020-06-10 12:18:12'),'YYYY-MM-DD HH24:MI:SS') FROM SYSIBM.DUAL;
--结果:2020-06-10 12:18:12
(2)char(arg)
把参数转化成字符串
values char(100); --把100转化为100字符串内容
2、LENGTH函数
语法
LENGTH(ARG)
LENGTH函数返回参数ARG
的长度。
SELECT LENGTH(LOG_MSG) FROM DBCM.LOGINFO
3、CONCAT
函数
字符串连接函数。
SELECT CONCAT(CONCAT('hello',' world'),' !') as test
FROM SYSIBM.DUAL;
--结果:hello world !
4、去空格函数
LTRIM
、RTRIM
函数去空格
DB2
中无trim()
函数,所以要去空格要执行左右去空格。
LTRIM()
:LTRIM
函数从CHAR
、VARCHAR
、GRAPHIC
或者VARGRAPHIC
中去掉左侧空格。RTRIM()
:RTRIM
函数则去去掉右侧的空格。
SELECT LTRIM(' hello 1'),RTRIM(' 2world ! ') FROM SYSIBM.DUAL;
5、截取/截断函数
(1)SUBSTR
函数
语法:
SUBSTR(ARG1,POS,<LENGTH>)
SUBSTR
函数返回ARG1
中POS
位置开始的LENGTH
个字符,如果没有指定LENGTH
,则返回剩余的字符。
substr()
是指从position开始算(包括position这个字符),截取的长度,也包括位置+长度所在的字符(前提是字符串的长度大于或等于两者之和)。
SELECT SUBSTR('helloworld',5,2) FROM SYSIBM.DUAL; --结果:ow
(2)LEFT
、RIGHT
函数
LEFT(ARG,LENGTH)
:LEFT函数返回ARG
最左边LENGTH
个字符串,ARG
可以是CHAR
或BINARY STRING
。
RIGHT(ARG,LENGTH)
:RIGHT函数返回ARG
最右边的LENGTH
个字符串
SELECT LEFT('hello',2),RIGHT('world',2) FROM SYSIBM.DUAL;
--结果: he ld
6、大小写转换
LCASE
、LOWER
、UCASE
、UPPER
函数
LCASE()、LOWER():
LCASE、LOWER函数返回定长、变长字符串的小写形式。
SELECT LCASE('heLLo'),LOWER('WORLD') FROM SYSIBM.DUAL; --结果:hello world
UCASE()、UPPER():
UCASE、UPPER函数返回定长、变长字符串的大写形式。
SELECT UCASE('heLLo'),UPPER('world') FROM SYSIBM.DUAL; --结果:HELLO WORLD
7、替换函数
(a)INSERT函数
语法:
INSERT(ARG1,POS,SIZE,ARG2) --找到位置替换
INSERT函数返回一个字符串,将ARG1
从POS
处删除SIZE
个字符,将ARG2
插入该位置。
(b)REPLACE函数
语法:
REPLACE(EXP1,EXP2,EXP3)
REPLACE函数用EXP3
代替EXP1
中所有的EXP2
。
SELECT REPLACE('ROMANND','NND','CCB') FROM SYSIBM.DUAL;
8、条件查找字符串
根据条件查找字符串,返回字符串。
(a)REPEAT函数
语法:
REPEAT(ARG1,NUM_TIMES)
REPEAT函数返回ARG1
被重复NUM_TIMES
次的字符串。
SELECT REPEAT('hello',2) FROM SYSIBM.DUAL;
(b)SPACE函数
语法:
SPACE(SIZE)
SPACE函数返回一个包含SIZE
个空格的字符串。
SELECT SPACE(10) FROM SYSIBM.DUAL; --结果没发打,就是10个空格字符串
四、判断函数
1、VALUE函数
VALUE(EXPRESSION1,EXPRESSION2)
--VALUE函数是用返回一个非空的值,当其第一个参数非空,直接返回该参数的值,如果第一个参数为空,则返回第二个参数的值。
--表示如果LOGINFO.ID为空,则返回空串,如果LOGINFO.ID不为空,则返回LOGINFO.ID。
SELECT VALUE(ID,'') FROM LOGINFO
2、COALESCE函数
处理null的函数。
COALESCE(ARG1,ARG2)
--COALESCE返回参数集中第一个非null参数。
--用法类似于VALUE函数。当其第一个参数非空,直接返回该参数的值,如果第一个参数为空,则返回第二个参数的值
select COALESCE(COUNT_AMT, '0.00') from LOGINFO ;
--金额为null的时候,显示0.00
3、NVL函数
处理null的函数。
NVL(exp1, exp2)
--如果exp1为NULL,则函数返回exp2,否则返回exp1本身。但此函数有一定局限,所以就有了NVL2函数。
select nvl(COUNT_AMT, '0.00') from LOGINFO ;
NVL2
函数:Oracle/PLsql
中的一个函数,Oracle在NVL
函数的功能上扩展,提供了NVL2
函数。NVL2(exp1, exp2, exp3)
的功能为:如果exp1
为NULL,则函数返回exp3
,若exp1
不为null,则返回exp2
。
4、CAST函数
与char有类似功能。可以用来转换类型。
SELECT CAST(CURRENT TIME AS CHAR(8) ) FROM SYSIBM.SYSDUMMY1
5、VARCHAR
函数
语法:
VARCHAR(ARG,LENGTH)
VARCHAR
函数返回ARG
字符串、日期型、图形串的可变长度LENGTH
的字符串表示。
SELECT VARCHAR('helloworld',5) FROM SYSIBM.DUAL;
6、CASE-WHEN函数
SELECT id,USER_ID,
(case
when(COUNT_AMT<=10000)then '一般'
when(COUNT_AMT>10000 and COUNT_AMT<=50000 ) then '普通'
when(COUNT_AMT>50000 and COUNT_AMT<=100000 ) then '富裕'
else '土豪' end ) AS status
FROM DBCM.LOGINFO
7、exists(A)函数
判断是否存在,存在数据返回true,不存在返回false。
在sql
中再具体使用示例说明。
8、判断字符位置
(a)instr
函数
语法:
instr(源字符串, 要查找的字符串, 从第几个字符开始, 要找到第几个匹配的序号)
数据库中字符串索引都是从1开始,从0开始的话是搜索不到的。
默认查找顺序为从左到右。当起始位置为负数的时候,从右边开始查找。
values instr('hello world','o',0,1); --DB2执行报错
values instr('hello world','o',1,1); --结果:5
values instr('hello world','o',1,2); --结果:8
select instr('hello world','o',-1,1) from SYSIBM.DUAL; --结果:8
(b)LOCATE
函数
语法:
LOCATE(ARG1,ARG2,<POS>) --只有起始位置
LOCATE函数在ARG2
中查找ARG1
第一次出现的位置,如果指定POS
,则从ARG2
的POS
处开始查找ARG1
第一次出现的位置。
SELECT LOCATE('l', 'hello world') from SYSIBM.DUAL; --结果:3
(c)POSSTR
函数
语法:
POSSTR(EXP1,EXP2)
POSSTR
函数返回EXP2
在EXP1
中的位置。 –没有起始位置和结束位置 SELECT LOCATE(NAME,’a’) FROM T1
SELECT POSSTR('hello world','wo') FROM SYSIBM.DUAL; --结果:7
五、其他
(1)row_number() over()函数
排序、分页常用。
排序:
select *,rownumber() over() as row_id from LOGINFO
分页:
select * from (
select *,rownumber() over() as row_id from LOGINFO
) where row_id between 1 and 10
(2)DIGITS函数:
DIGITS函数返回SMALLINT
、INTEGER
、BIGIT
或者DECIMAL
参数的字符串值。
SELECT DIGITS('123') FROM SYSIBM.DUAL;
(3)DOUBLE、FLOAT函数:
DOUBLE、FLOAT函数如果参数是一个数字表达式,返回与其对应的浮点数,否则返回错误代码。
SELECT DOUBLE('4569') FROM SYSIBM.DUAL;
(4)INT函数
INT函数返回整型常量中的数字、字符串或者日期、时间的整数表示。
SELECT INT('123') FROM SYSIBM.DUAL;
(5)BIGINT
函数
BIGINT
函数返回整型常量中的数字、字符串或者时间戳的64位长整数表示。
SELECT BIGINT('789987') FROM SYSIBM.DUAL;
(6)SMALLINT
函数
SMALLINT
函数返回整型常量中的数字、字符串短整数表示。
SELECT SMALLINT('124') FROM SYSIBM.DUAL;
(7)REAL函数
REAL函数返回一个数值的单精度浮点数表示。
SELECT REAL(10) FROM SYSIBM.DUAL; --结果:10.0
(8)DEC[IMAL]
函数
DEC[IMAL]
函数返回一个数值、DECIMAL
的字符串、INTEGER
的字符串、FLOAT-POINT
的字符串、日期、时间或时间戳的DECIMAL
数值。
SELECT DEC(10.1314) FROM SYSIBM.DUAL; --结果:10
(9)HEX函数
HEX函数返回一个字符串的值的16进制表示。
SELECT HEX(10) FROM SYSIBM.DUAL; --结果:0A000000
(10)FLOOR函数
FLOOR函数取小于或等于参数的最大整数。
SELECT FLOOR(10.50) FROM SYSIBM.DUAL; --结果:10