我们只可以从一个date类型中截取 year,month,day(date日期的格式为yyyy-mm-dd); 也只可以从一个 timestamp with time zone 的数据类型中截取TIMEZONE_HOUR和TIMEZONE_MINUTE;获取两个日期之间的具体时间间隔,extract函数是最好的选择。
示例:
select systimestamp s,
extract(year from systimestamp) year,
extract(month from systimestamp) month,
extract(day from systimestamp) day,
extract(minute from systimestamp) minute,
extract(second from systimestamp) second,
extract(timezone_hour from systimestamp) th,--时区:8
extract(timezone_minute from systimestamp) tm,
extract(timezone_region from systimestamp) tr,
extract(timezone_abbr from systimestamp) ta
from dual;
【注】关于TIMEZONE_HOUR、TIMEZONE_MINUTE、TIMEZONE_REGION和TIMEZONE_ABBR,用到时再研究。
2. 数字函数 2.1 取整函数
ceil 向上取整,floor 向下取整:
select ceil(66.6) N1,floor(66.6) N2 from dual;--结果为67和66
2.2 取幂(power) 和 求平方根(sqrt)select power(3,2) N1,sqrt(9) N2 from dual;
2.3 求余mod(n1,n2)select mod(9,5) from dual;
2.4 返回固定小数位数round(num,len)四舍五入,trunc(num,len)直接截断:
select round(66.667,2) N1,trunc(66.667,2) N2 from dual;
2.5 返回值的符号sign(n),正数返回为1,负数为-1:
select sign(-32),sign(293) from dual;
3. 字符函数 3.1 initcap(st)返回st将每个单词的首字母大写,所有其他字母小写
3.2 lower(st)返回st将每个单词的字母全部小写
3.3 upper(st)返回st将每个单词的字母全部大写
3.4 concat(st1,st2)返回st为st2接st1的末尾(可用操作符"||")
3.5 lpad(st1,n[,st2])返回右对齐的st,st为在st1的左边用st2填充直至长度为n,st2的缺省为空格
3.6 rpad(st1,n[,st2])返回左对齐的st,st为在st1的右边用st2填充直至长度为n,st2的缺省为空格
3.7 ltrim(st[,set])返回st,st为从左边删除set中字符直到第一个不是set中的字符。缺省时,指的是空格
3.8 rtrim(st[,set])返回st,st为从右边删除set中字符直到第一个不是set中的字符。缺省时,指的是空格
3.9 replace(st,search_st[,replace_st])将每次在st中出现的search_st用replace_st替换,返回一个st。缺省时,删除search_st
3.10 substr(st,m[,n])n=返回st串的子串,从m位置开始,取n个字符长。缺省时,一直返回到st末端
3.11 length(st)数值,返回st中的字符数
3.12 instr(st1,st2[,m[,n]])数值,返回st1从第m字符开始,st2第n次出现的位置,m及n的缺省值为1
4. 转换函数 4.1 to_char(type,[fmt])这里type为date/timestamp/int/float/numeric等,数据类型不同,格式fmt也不同。
4.1.1 日期转字符select to_char(sysdate) s1,--日-月-年,格式与语言环境有关
to_char(sysdate, 'yyyy-mm-dd') s2,
to_char(sysdate, 'yyyy') s3,
to_char(sysdate, 'yyyy-mm-dd hh12:mi:ss') s4,
to_char(sysdate, 'hh24:mi:ss') s5,
to_char(sysdate, 'DAY') s6
from dual;
4.1.2 时间戳转字符select sysdate,
systimestamp,
to_char(systimestamp, 'yyyymmdd hh24:mi:ssxff6'),
to_char(systimestamp, 'yyyymmdd hh24:mi:ss.ff6'),
to_char(timestamp '2011-09-14 12:52:42.123456789', 'YYYY-MM-DD')
from dual;
4.1.3 数字转字符select to_char(88877) s1,
to_char(1234567890, '099999999999999') s2,-- 000001234567890
to_char(12345678, '999,999,999,999') s3,
to_char(123456, '99.999') s4,--溢出,显示#####
to_char(1234567890, '999,999,999,999.9999') s5,
to_char(123, 'xx') s6,--十六制,7b
to_char(4567, 'xxxx') s7,--11d7
to_char(12345,'$99999') s8,--$12345
to_char(12345.6,'$99,999.00') s9--$12345.60
from dual;
【注】timestamp含义为时间戳,精确到小数秒(fractional_seconds_precision),可以是 0 to 9,缺省是6:
select systimestamp,systimestamp(9) from dual;
4.2 to_date(c,[fmt]) 4.3 to_timestamp(c,[fmt]) 4.4 to_number(c,[fmt]) 5. 分组函数Oracle中的分组有两种——group by 和partition by:
group by更强调的是一个整体,就是组,只能显示一个组里满足聚合函数的一条记录; partition by 在整体后更强调个体,能显示组里所有个体的记录。
相应的分组函数也可以分为两大类:
5.1 聚合函数 5.1.1 统计方式 5.1.1.1 rollup按分组的第一个列进行统计和最后的小计:
select t.apply_id, t.disposal_field, count(1)
from ebill_dump_apply_detail t
group by rollup(t.apply_id, t.disposal_field);
5.1.1.2 cube
按分组的所有列的进行统计和最后的小计:
select t.apply_id, t.disposal_field, count(1)
from ebill_dump_apply_detail t
group by rollup(t.apply_id, t.disposal_field);
5.2 分析函数 5.2.1 什么是分析函数