oracle日期格式数据操作

深碍√TFBOYSˉ_ 2021-09-23 14:30 446阅读 0赞

以下假定sysdate为 2019-12-30 10:10:10

1. trunc

作用:对日期进行截取

说明:(1)trunc截取完date格式的数据后,依然是date格式

  1. select trunc(sysdate, 'yyyy') from dual; -- 2019-01-01 00:00:00对应日期
  2. select trunc(sysdate, 'mm') from dual; -- 2019-12-01 00:00:00对应日期
  3. select trunc(sysdate, 'dd') from dual; -- 2019-12-30 00:00:00对应日期

(2)如何验证 trunc(sysdate, ‘yyyy’) 对应的日期是否为2019-01-01 00:00:00呢?

  1. select to_char(trunc(sysdate, 'yyyy'), 'yyyy-mm-dd hh24:mi:ss') from dual;

(3)如果截取的是yyyy,会把sysdate中的月、日、时、分、秒给置换成初始值(月和日最小就是01,时、分、秒最小就是00)

如果截取的是mm,会把sysdate中的日、时、分、秒给置换成初始值

如果取其他的格式字符,可以发现类似规律

2. to_char

作用:日期格式转字符串格式

说明:(1)将日期转换成格式化字符串,to_char操作后就是字符串类型了

比如:将sysdate转化成短日期格式 2019-12-30,

  1. select to_char(sysdate, 'yyyy-mm-dd') from dual;

(2)截取sysdate中的某个部分

  1. select to_char(sysdate, 'yyyy') as yearStr from dual; -- (只查看年)2019
  2. select to_char(sysdate, 'mm') as monthStr from dual; -- (只查看月)12
  3. select to_char(sysdate, 'dd') as dayStr from dual; -- (只查看日)30
  4. select to_char(sysdate, 'q') as quarterStr from dual; -- (只查看季度)4

3. add_months

作用:将指定日期增加或减少几个月

说明:

(1)基本使用

add_months操作后还是日期格式

  1. select add_months(sysdate, 1) from dual; -- 2020-1-30 10:10:10对应日期(将当前时间向后推移1个月)
  2. select add_months(sysdate, -1) from dual; -- 2019-11-30 10:10:10对应日期(将当前时间向前推移1个月)

(2)如果要增加1年呢?

  1. select add_months(sysdate, 1*12) from dual; -- 2020-12-30 10:10:10对应日期(将当前时间向后推移1年)

n年(n>0就是向后推移,n<0就是向前推移)的话就是

select add_months(sysdate, n*12) from dual;

如果要增加1天呢?

  1. select sysdate+1 from dual;

n天(n>0就是向后推移,n<0就是向前推移)的话就是

select sysdate+n from dual;

综合应用

1. 检查当前时间是否为本月的20号

  1. to_char(sysdate, 'yyyy-mm-dd') = to_char(trunc(sysdate, 'mm') + 19, 'yyyy-mm-dd')

验证(其他验证日期比较条件是否正确的也可以借用下面这种方法):

  1. select 'AA' from dual where to_char(sysdate, 'yyyy-mm-dd') = to_char(trunc(sysdate, 'mm') + 19, 'yyyy-mm-dd'); -- 显然2019-12-30不是所在月份(12月)的20日,查询没有数据
  2. select 'AA' from dual where to_date('2019-12-20', 'yyyy-mm-dd') = trunc(sysdate, 'mm') + 19; -- 显然2019-12-20是所在月份(12月)的20日,查询有数据

扩展:存储过程中if判断条件中写成

  1. begin
  2. -- 检查当前时间是否为本月的20号(这里要注意的是判断相等,要写=,而不是==)
  3. if to_char(sysdate, 'yyyy-mm-dd') = (to_char(trunc(sysdate, 'mm') + 19, 'yyyy-mm-dd')) then
  4. dbms_output.put_line('是本月20日');
  5. end if;
  6. -- 检查当前时间是否不是本月的20
  7. if to_char(sysdate, 'yyyy-mm-dd') != (to_char(trunc(sysdate, 'mm') + 19, 'yyyy-mm-dd')) then
  8. dbms_output.put_line('不是本月20日'); -- 会打印
  9. end if;
  10. -- 检查当前时间是否处在本月下旬(从21日到月底)
  11. if to_char(sysdate, 'yyyy-mm-dd') > (to_char(trunc(sysdate, 'mm') + 19, 'yyyy-mm-dd')) then
  12. dbms_output.put_line('是本月下旬'); -- 会打印
  13. end if;
  14. end;

2. 检查当前时间是否为当季度的最后一个月的20号

  1. to_char(sysdate, 'yyyy-mm-dd') = to_char(add_months(trunc(sysdate, 'q'), 2)+19, 'yyyy-mm-dd')

说明:

  1. select to_char(add_months(trunc(sysdate, 'q'), 2)+19, 'yyyy-mm-dd') from dual; -- 2019-12-20

发表评论

表情:
评论列表 (有 0 条评论,446人围观)

还没有评论,来说两句吧...

相关阅读