Oracle 中add_months和trunc的用法,数据类型

本文介绍了Oracle数据库的相关知识,包括使用add_months和trunc函数确定一年内天数,add_months可获取某时间前后n个月时间,trunc能截断数字和日期。还详细阐述了CHAR、VARCHAR2等多种数据类型的特点、存储容量及适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、确定一年内的天数
select add_months(trunc(sysdate,‘y’),12)-trunc(sysdate,‘y’) from dual;
在这里插入图片描述

2、add_months(time,months)函数可以得到某一时间之前或之后n个月的时间
在这里插入图片描述

3、TRUNC(NUMBER)表示截断数字,TRUNC(date)表示截断日期
截断数字:
格式:TRUNC(n1,n2),n1表示被截断的数字,n2表示要截断到那一位。n2可以是负数,表示截断小数点前。注意,TRUNC截断不是四舍五入,round是四舍五入。
截断日期:
在这里插入图片描述

4、
CHAR
最多可以以固定长度的格式存储 2000 个字符或字节。默认指定为以字符形式进行存储,这个数据类型是固定长度的,并且当位数不够时,需要在其右边添加空格来补满。

VARCHAR 和 VARCHAR2
最多可以以可变长度来存储 4000B,因此不需要空格来作补充。VARCHAR2 比 VARCHAR 更适合使用,由于兼容性的原因,所以仍然在 Oracle 数据库中保留着 VARCHAR 。

NCHAR
NLS(national language support ,国际语言支持)的数据类型仅可以存储由数据库 NLS 字符集定义的 Unicode 字符集。该数据类型最多可以存储 2000B。NCHAR 的列在位数不够时需要在右边填充空格。

NVARCHAR2
NLS 的数据类型与 VARCHAR2 数据类型等价。这个数据类型最多可存储 4000B

NUMBER
用于存储零、正数、定长负数以及浮点数。NUMBER 数据类型可以以 NUMBER(P,S)的形式来定义数字的精度和范围。 这里:p 表示精度 (1-38),它表示存储在列中数字的总长度是 p 位: s 表示范围,它表示小数点后的位数。该取值范围可以从-84 到 127 。

LONG 类型的列存储可变长度的字符串,最多可以存储 2GB 的数据。LONG 类型的列有很多在 VARCHAR2 类型列中所具有的特征。可以使用 LONG 类型的列来存储 LONG 类型的文本字符串。LONG 数据类型的使用是为了向前兼容的需要。建议使用 LOB 数据类型来代替 LONG 类型。

DATE
用于在数据库中存储日期和时间。存储时间的精度可以达到 1/100s。不提供时区的相关信息。

TIMESTAMP
使用年、月、日、小时、分钟、秒域来对日期/时间提供更详细的支持。最多可以使用 9 位数字的精度来存储秒(受底层操作系统支持的限制)。这个数据类型没有时区的相关信息,它可以在 Oracle9i 数据库及其更
新的版本中使用。

TIMESTAMP WITH TIME ZONE
包含 TIMESTAMP 数据类型中的所有域,除此之外,还包含两个额外的域:timezone_hour 和 timezone_minute。这个数据类型包含支持时区的相关信息。这个数据类型可以在 Oracle9i 数据库及其更新的版本中使用。

TIMESTAMP WITH LOCAL TIME ZONE
除了在数据库中存储的时区采用标准化以外,所包含的其他域与 TIMESTAMP 数据类型中的域相同。当选择列时,将日期/时间标准为会话的时区。这个数据类型可以在Oracle9i 数据库及其更新的版本中使用。

INTERVAL YEAR TO MONTH
用于存储一个时间段,由月份和年组成。需要 5B 来存储。这个数据类型可以在 Oracle9i 数据库及其更新的版本中使用。

INTERVAL DAY TO SECOND
用于存储一个时间段,由日和秒组成。需要 11B 来存储。这个数据类型可以在 Oracle9i 数据库及其更新的版本中使用。

RAW
用于存储 raw 类型的二进制数据。最多可以存储 2000B。建议使用 BLOB 来代替它。

LONG RAW
用于存储 raw 类型的二进制数据。最多可以存储 2GB 的数据。建议使用 BLOB 来代替它。

ROWID
表中 ROWID 类型的字符串表示。使用这个数据类型来存储由 ROWID 类型伪列的返回值。

UROWID
在索引组织表中表示逻辑行地址。

CLOB
用于存储基于字符的大对象。在 Oracle9i 数据库中最多可以存储 4GB 的数据,这比 Oracle10g 数据库中可存储的最大数据还要大,这也是现在数据库规定块大小的一个因素(~4GB* 数据块大小)。

NCLOB
可以使用由数据库国际字符集所定义的字符集来存储仅为 Unicode 类型的基于字符的数据。最多可以存储4GB 的数据,这比 Oracle10g 数据库中可存储的最大数据还要大,这也是现在数据库规定块大小的一个因素(~4GB* 数据块大小)。

BLOB
最多可以存储 4GB 数据的二进制大对象,这比 Oracle10g 数据库中可存储的最大数据还要大,这也是现在数据库规定块大小的一个因素(~4GB* 数据库块大小)。

BFILE
存储指向数据库外部文件的定位符。外部文件最大为 4GB。

BINARY_FLOAT
该数据类型是一个基于 ANSI_IEEE745 标准的浮点数据类型。它定义了一个 32 位的双精度浮点数。这个数据类型需要 5B 的存储空间。

BINARY_DOUBLE
该数据类型是一个基于 ANSI_IEEE745 标准的双精度浮点数据类型,它定义了一个 32 位的双精度浮点数。这个数据类型需要 9B 节的存储空间。

【--4、去月保费 Execute Immediate 'truncate table jsxs_day_qy1 '; insert into jsxs_day_qy1 select /*+parallel(4) */ level2comcode, level3comcode, riskcode, newchnltype, sum(PREMIUM) PREMIUM, datetype from (select /*+parallel(4) */ b.level2comcode, b.level3comcode, substr(a.RISKCODE, 1, 2) as riskcode, (case when x.newchnltype is null then '00' else x.newchnltype end) newchnltype, (a.PREMIUM * a.EXCHRATE * a.COINSRATE / 100) AS PREMIUM, --原始保费收入 'STATDATE' as datetype FROM WEB_LIST_CMAINORIGIN a, cd_com_all b, ods_cmain x WHERE a.STATDATE between add_months(trunc(sysdate - 1, 'mm'), -12) and add_months(trunc(sysdate - 1), -12) and a.COMCODE = b.comcode and a.policyno = x.policyno(+) UNION ALL select /*+parallel(4) */ d.level2comcode, d.level3comcode, substr(c.RISKCODE, 1, 2) as riskcode, (case when y.newchnltype is null then '00' else y.newchnltype end) newchnltype, (c.CHGPREMIUM * c.EXCHRATE * c.COINSRATE / 100) AS PREMIUM, --批改保费 'STATDATE' as datetype FROM WEB_LIST_PMAIN c, cd_com_all d, ods_pmain y WHERE c.STATDATE between add_months(trunc(sysdate - 1, 'mm'), -12) and add_months(trunc(sysdate - 1), -12) and c.COMCODE = d.comcode and c.endorseno = y.endorseno(+) and c.CHGPREMIUM != 0 union all select /*+parallel(4) */ e.level2comcode, e.level3comcode, substr(f.RISKCODE, 1, 2) as riskcode, (case when m.newchnltype is null then '00' else m.newchnltype end) newchnltype, (f.PREMIUM * f.EXCHRATE * f.COINSRATE / 100) AS PREMIUM, --原始保费收入 'UNDERWRITEENDDATE' as datetype FROM WEB_LIST_CMAINORIGIN f, cd_com_all e, ods_cmain m WHERE f.UNDERWRITEENDDATE between add_months(trunc(sysdate - 1, 'mm'), -12) and add_months(trunc(sysdate - 1), -12) and f.COMCODE = e.comcode and f.policyno = m.policyno(+) UNION ALL select /*+parallel(4) */ h.level2comcode, h.level3comcode, substr(g.RISKCODE, 1, 2) as riskcode, (case when n.newchnltype is null then '00' else n.newchnltype end) newchnltype, (g.CHGPREMIUM * g.EXCHRATE * g.COINSRATE / 100) AS PREMIUM, --批改保费 'UNDERWRITEENDDATE' as datetype FROM WEB_LIST_PMAIN g, cd_com_all h, ods_pmain n WHERE g.STATDATE between add_months(trunc(sysdate - 1, 'mm'), -12) and add_months(trunc(sysdate - 1), -12) and g.COMCODE = h.comcode and g.endorseno = n.endorseno(+) and g.CHGPREMIUM != 0) group by level2comcode, level3comcode, riskcode, newchnltype, datetype; --5、去年保费 Execute Immediate 'truncate table jsxs_day_qn1'; insert into jsxs_day_qn1 select /*+parallel(4) */ level2comcode, level3comcode, riskcode, newchnltype, sum(PREMIUM) PREMIUM, datetype from (select /*+parallel(4) */ b.level2comcode, b.level3comcode, substr(a.RISKCODE, 1, 2) as riskcode, (case when x.newchnltype is null then '00' else x.newchnltype end) newchnltype, (a.PREMIUM * a.EXCHRATE * a.COINSRATE / 100) AS PREMIUM, --原始保费收入 'STATDATE' as datetype FROM WEB_LIST_CMAINORIGIN a, cd_com_all b, ods_cmain x WHERE a.STATDATE between add_months(trunc(sysdate - 1, 'yy'), -12) and add_months(trunc(sysdate - 1), -12) and a.COMCODE = b.comcode and a.policyno = x.policyno(+) UNION ALL select /*+parallel(4) */ d.level2comcode, d.level3comcode, substr(c.RISKCODE, 1, 2) as riskcode, (case when y.newchnltype is null then '00' else y.newchnltype end) newchnltype, (c.CHGPREMIUM * c.EXCHRATE * c.COINSRATE / 100) AS PREMIUM, --批改保费 'STATDATE' as datetype FROM WEB_LIST_PMAIN c, cd_com_all d, ods_pmain y WHERE c.STATDATE between add_months(trunc(sysdate - 1, 'yy'), -12) and add_months(trunc(sysdate - 1), -12) and c.COMCODE = d.comcode and c.endorseno = y.endorseno(+) and c.CHGPREMIUM != 0 union all select /*+parallel(4) */ e.level2comcode, e.level3comcode, substr(f.RISKCODE, 1, 2) as riskcode, (case when m.newchnltype is null then '00' else m.newchnltype end) newchnltype, (f.PREMIUM * f.EXCHRATE * f.COINSRATE / 100) AS PREMIUM, --原始保费收入 'UNDERWRITEENDDATE' as datetype FROM WEB_LIST_CMAINORIGIN f, cd_com_all e, ods_cmain m WHERE f.UNDERWRITEENDDATE between add_months(trunc(sysdate - 1, 'yy'), -12) and add_months(trunc(sysdate - 1), -12) and f.COMCODE = e.comcode and f.policyno = m.policyno(+) UNION ALL select /*+parallel(4) */ h.level2comcode, h.level3comcode, substr(g.RISKCODE, 1, 2) as riskcode, (case when n.newchnltype is null then '00' else n.newchnltype end) newchnltype, (g.CHGPREMIUM * g.EXCHRATE * g.COINSRATE / 100) AS PREMIUM, --批改保费 'UNDERWRITEENDDATE' as datetype FROM WEB_LIST_PMAIN g, cd_com_all h, ods_pmain n WHERE g.STATDATE between add_months(trunc(sysdate - 1, 'yy'), -12) and add_months(trunc(sysdate - 1), -12) and g.COMCODE = h.comcode and g.endorseno = n.endorseno(+) and g.CHGPREMIUM != 0) group by level2comcode, level3comcode, riskcode, newchnltype, datetype; --6、去季度保费 Execute Immediate 'truncate table jsxs_day_qj1 '; insert into jsxs_day_qj1 select /*+parallel(4) */ level2comcode, level3comcode, riskcode, newchnltype, sum(PREMIUM) PREMIUM, datetype from (select /*+parallel(4) */ b.level2comcode, b.level3comcode, substr(a.RISKCODE, 1, 2) as riskcode, (case when x.newchnltype is null then '00' else x.newchnltype end) newchnltype, (a.PREMIUM * a.EXCHRATE * a.COINSRATE / 100) AS PREMIUM, --原始保费收入 'STATDATE' as datetype FROM WEB_LIST_CMAINORIGIN a, cd_com_all b, ods_cmain x WHERE a.STATDATE between add_months(trunc(sysdate - 1, 'q'), -12) and add_months(trunc(sysdate - 1), -12) and a.COMCODE = b.comcode and a.policyno = x.policyno(+) UNION ALL select /*+parallel(4) */ d.level2comcode, d.level3comcode, substr(c.RISKCODE, 1, 2) as riskcode, (case when y.newchnltype is null then '00' else y.newchnltype end) newchnltype, (c.CHGPREMIUM * c.EXCHRATE * c.COINSRATE / 100) AS PREMIUM, --批改保费 'STATDATE' as datetype FROM WEB_LIST_PMAIN c, cd_com_all d, ods_pmain y WHERE c.STATDATE between add_months(trunc(sysdate - 1, 'q'), -12) and add_months(trunc(sysdate - 1), -12) and c.COMCODE = d.comcode and c.endorseno = y.endorseno(+) and c.CHGPREMIUM != 0 union all select /*+parallel(4) */ e.level2comcode, e.level3comcode, substr(f.RISKCODE, 1, 2) as riskcode, (case when m.newchnltype is null then '00' else m.newchnltype end) newchnltype, (f.PREMIUM * f.EXCHRATE * f.COINSRATE / 100) AS PREMIUM, --原始保费收入 'UNDERWRITEENDDATE' as datetype FROM WEB_LIST_CMAINORIGIN f, cd_com_all e, ods_cmain m WHERE f.UNDERWRITEENDDATE between add_months(trunc(sysdate - 1, 'q'), -12) and add_months(trunc(sysdate - 1), -12) and f.COMCODE = e.comcode and f.policyno = m.policyno(+) UNION ALL select /*+parallel(4) */ h.level2comcode, h.level3comcode, substr(g.RISKCODE, 1, 2) as riskcode, (case when n.newchnltype is null then '00' else n.newchnltype end) newchnltype, (g.CHGPREMIUM * g.EXCHRATE * g.COINSRATE / 100) AS PREMIUM, --批改保费 'UNDERWRITEENDDATE' as datetype FROM WEB_LIST_PMAIN g, cd_com_all h, ods_pmain n WHERE g.STATDATE between add_months(trunc(sysdate - 1, 'q'), -12) and add_months(trunc(sysdate - 1), -12) and g.COMCODE = h.comcode and g.endorseno = n.endorseno(+) and g.CHGPREMIUM != 0) group by level2comcode, level3comcode, riskcode, newchnltype, datetype; --7、当季保费 Execute Immediate 'truncate table jsxs_day_dj1 '; insert into jsxs_day_dj1 select /*+parallel(4) */ level2comcode, level3comcode, riskcode, newchnltype, sum(PREMIUM) PREMIUM, datetype from (select /*+parallel(4) */ b.level2comcode, b.level3comcode, substr(a.RISKCODE, 1, 2) as riskcode, (case when x.newchnltype is null then '00' else x.newchnltype end) newchnltype, (a.PREMIUM * a.EXCHRATE * a.COINSRATE / 100) AS PREMIUM, --原始保费收入 'STATDATE' as datetype FROM WEB_LIST_CMAINORIGIN a, cd_com_all b, ods_cmain x WHERE a.STATDATE between trunc(trunc(sysdate - 1), 'q') and trunc(sysdate - 1) and a.COMCODE = b.comcode and a.policyno = x.policyno(+) UNION ALL select /*+parallel(4) */ d.level2comcode, d.level3comcode, substr(c.RISKCODE, 1, 2) as riskcode, (case when y.newchnltype is null then '00' else y.newchnltype end) newchnltype, (c.CHGPREMIUM * c.EXCHRATE * c.COINSRATE / 100) AS PREMIUM, --批改保费 'STATDATE' as datetype FROM WEB_LIST_PMAIN c, cd_com_all d, ods_pmain y WHERE c.STATDATE between trunc(trunc(sysdate - 1), 'q') and trunc(sysdate - 1) and c.COMCODE = d.comcode and c.endorseno = y.endorseno(+) and c.CHGPREMIUM != 0 union all select /*+parallel(4) */ e.level2comcode, e.level3comcode, substr(f.RISKCODE, 1, 2) as riskcode, (case when m.newchnltype is null then '00' else m.newchnltype end) newchnltype, (f.PREMIUM * f.EXCHRATE * f.COINSRATE / 100) AS PREMIUM, --原始保费收入 'UNDERWRITEENDDATE' as datetype FROM WEB_LIST_CMAINORIGIN f, cd_com_all e, ods_cmain m WHERE f.UNDERWRITEENDDATE between trunc(trunc(sysdate - 1), 'q') and trunc(sysdate - 1) and f.COMCODE = e.comcode and f.policyno = m.policyno(+) UNION ALL select /*+parallel(4) */ h.level2comcode, h.level3comcode, substr(g.RISKCODE, 1, 2) as riskcode, (case when n.newchnltype is null then '00' else n.newchnltype end) newchnltype, (g.CHGPREMIUM * g.EXCHRATE * g.COINSRATE / 100) AS PREMIUM, --批改保费 'UNDERWRITEENDDATE' as datetype FROM WEB_LIST_PMAIN g, cd_com_all h, ods_pmain n WHERE g.STATDATE between trunc(trunc(sysdate - 1), 'q') and trunc(sysdate - 1) and g.COMCODE = h.comcode and g.endorseno = n.endorseno(+) and g.CHGPREMIUM != 0) group by level2comcode, level3comcode, riskcode, newchnltype, datetype; --8、去年全年保费 Execute Immediate 'truncate table jsxs_day_qqn'; insert into jsxs_day_qqn select /*+parallel(4) */ level2comcode, level3comcode, riskcode, newchnltype, sum(PREMIUM) PREMIUM, datetype from (select /*+parallel(4) */ b.level2comcode, b.level3comcode, substr(a.RISKCODE, 1, 2) as riskcode, (case when x.newchnltype is null then '00' else x.newchnltype end) newchnltype, (a.PREMIUM * a.EXCHRATE * a.COINSRATE / 100) AS PREMIUM, --原始保费收入 'STATDATE' as datetype FROM WEB_LIST_CMAINORIGIN a, cd_com_all b, ods_cmain x WHERE a.STATDATE between add_months(trunc(sysdate - 1, 'yy'), -12) and trunc(sysdate - 1, 'yy') - 1 and a.COMCODE = b.comcode and a.policyno = x.policyno(+) UNION ALL select /*+parallel(4) */ d.level2comcode, d.level3comcode, substr(c.RISKCODE, 1, 2) as riskcode, (case when y.newchnltype is null then '00' else y.newchnltype end) newchnltype, (c.CHGPREMIUM * c.EXCHRATE * c.COINSRATE / 100) AS PREMIUM, --批改保费 'STATDATE' as datetype FROM WEB_LIST_PMAIN c, cd_com_all d, ods_pmain y WHERE c.STATDATE between add_months(trunc(sysdate - 1, 'yy'), -12) and trunc(sysdate - 1, 'yy') - 1 and c.COMCODE = d.comcode and c.endorseno = y.endorseno(+) and c.CHGPREMIUM != 0 union all select /*+parallel(4) */ e.level2comcode, e.level3comcode, substr(f.RISKCODE, 1, 2) as riskcode, (case when m.newchnltype is null then '00' else m.newchnltype end) newchnltype, (f.PREMIUM * f.EXCHRATE * f.COINSRATE / 100) AS PREMIUM, --原始保费收入 'UNDERWRITEENDDATE' as datetype FROM WEB_LIST_CMAINORIGIN f, cd_com_all e, ods_cmain m WHERE f.UNDERWRITEENDDATE between add_months(trunc(sysdate - 1, 'yy'), -12) and trunc(sysdate - 1, 'yy') - 1 and f.COMCODE = e.comcode and f.policyno = m.policyno(+) UNION ALL select /*+parallel(4) */ h.level2comcode, h.level3comcode, substr(g.RISKCODE, 1, 2) as riskcode, (case when n.newchnltype is null then '00' else n.newchnltype end) newchnltype, (g.CHGPREMIUM * g.EXCHRATE * g.COINSRATE / 100) AS PREMIUM, --批改保费 'UNDERWRITEENDDATE' as datetype FROM WEB_LIST_PMAIN g, cd_com_all h, ods_pmain n WHERE g.STATDATE between add_months(trunc(sysdate - 1, 'yy'), -12) and trunc(sysdate - 1, 'yy') - 1 and g.COMCODE = h.comcode and g.endorseno = n.endorseno(+) and g.CHGPREMIUM != 0) group by level2comcode, level3comcode, riskcode, newchnltype, datetype; --9、前年全年保费 Execute Immediate 'truncate table jsxs_day_qiannianquan'; insert into jsxs_day_qiannianquan select /*+parallel(4) */ level2comcode, level3comcode, riskcode, newchnltype, sum(PREMIUM) PREMIUM, datetype from (select /*+parallel(4) */ b.level2comcode, b.level3comcode, substr(a.RISKCODE, 1, 2) as riskcode, (case when x.newchnltype is null then '00' else x.newchnltype end) newchnltype, (a.PREMIUM * a.EXCHRATE * a.COINSRATE / 100) AS PREMIUM, --原始保费收入 'STATDATE' as datetype FROM WEB_LIST_CMAINORIGIN a, cd_com_all b, ods_cmain x WHERE a.STATDATE between add_months(trunc(sysdate - 1, 'yy'), -24) and add_months(trunc(sysdate - 1, 'yy'), -12) - 1 and a.COMCODE = b.comcode and a.policyno = x.policyno(+) UNION ALL select /*+parallel(4) */ d.level2comcode, d.level3comcode, substr(c.RISKCODE, 1, 2) as riskcode, (case when y.newchnltype is null then '00' else y.newchnltype end) newchnltype, (c.CHGPREMIUM * c.EXCHRATE * c.COINSRATE / 100) AS PREMIUM, --批改保费 'STATDATE' as datetype FROM WEB_LIST_PMAIN c, cd_com_all d, ods_pmain y WHERE c.STATDATE between add_months(trunc(sysdate - 1, 'yy'), -24) and add_months(trunc(sysdate - 1, 'yy'), -12) - 1 and c.COMCODE = d.comcode and c.endorseno = y.endorseno(+) and c.CHGPREMIUM != 0 union all select /*+parallel(4) */ e.level2comcode, e.level3comcode, substr(f.RISKCODE, 1, 2) as riskcode, (case when m.newchnltype is null then '00' else m.newchnltype end) newchnltype, (f.PREMIUM * f.EXCHRATE * f.COINSRATE / 100) AS PREMIUM, --原始保费收入 'UNDERWRITEENDDATE' as datetype FROM WEB_LIST_CMAINORIGIN f, cd_com_all e, ods_cmain m WHERE f.UNDERWRITEENDDATE between add_months(trunc(sysdate - 1, 'yy'), -24) and add_months(trunc(sysdate - 1, 'yy'), -12) - 1 and f.COMCODE = e.comcode and f.policyno = m.policyno(+) UNION ALL select /*+parallel(4) */ h.level2comcode, h.level3comcode, substr(g.RISKCODE, 1, 2) as riskcode, (case when n.newchnltype is null then '00' else n.newchnltype end) newchnltype, (g.CHGPREMIUM * g.EXCHRATE * g.COINSRATE / 100) AS PREMIUM, --批改保费 'UNDERWRITEENDDATE' as datetype FROM WEB_LIST_PMAIN g, cd_com_all h, ods_pmain n WHERE g.STATDATE between add_months(trunc(sysdate - 1, 'yy'), -24) and add_months(trunc(sysdate - 1, 'yy'), -12) - 1 and g.COMCODE = h.comcode and g.endorseno = n.endorseno(+) and g.CHGPREMIUM != 0) group by level2comcode, level3comcode, riskcode, newchnltype, datetype;】改为高斯DB
最新发布
08-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值