当前位置:数据库 > Oracle >>

oracle获取上一旬的开始时间和结束时间的函数

oracle获取上一旬的开始时间和结束时间的函数
 
[sql] 
-- 获取上旬开始时间  
create or replace function fd_lastxunstart(rq in date) return string is  
  refstr varchar2(50);  
  v_rq   date;  
begin  
  --获取上一旬的日期  
  v_rq := trunc(rq);  
  select case decode(trunc((to_char(v_rq, 'dd') - 1) / 10),  
                 0,  
                 '上旬',  
                 1,  
                 '中旬',  
                 '下旬')  
           when '上旬' then --返回上个月的下旬  
            to_char(add_months(v_rq, -1), 'yyyyMM') || '21'  
           when '中旬' then  
            to_char(v_rq, 'yyyymm') || '01' else   
            to_char(v_rq, 'yyyymm') || '11'  
         end  
    into refstr  
    from dual;  
  return refstr;  
end fd_lastxunstart;  
  
  
-- 这个返回的是:上旬的开始日期  
select sysdate from dual;   
select fd_lastxunstart(sysdate) from dual;   
select fd_lastxunstart(to_date('20130305','yyyymmdd')) from dual;  
select fd_lastxunstart(to_date('20130311','yyyymmdd')) from dual;  
select fd_lastxunstart(to_date('20130325','yyyymmdd')) from dual;  
  
  
-- 执行结果为: 2013/9/5 12:08:39、20130821、20130221、20130301、20130311  
  
---- 获取上一旬的结束日期  
-- 传递进去 一个 date 类型的值,返回一个varchar类型的上旬结束日期  
create or replace function fd_lastxunend(rq in date) return string is  
  refstr varchar2(50);  
  v_rq   date;  
begin  
  --获取上一旬的日期  
  v_rq := trunc(rq);  
  select case decode(trunc((to_char(v_rq, 'dd') - 1) / 10),  
                 0,  
                 '上旬',  
                 1,  
                 '中旬',  
                 '下旬')  
           when '上旬' then --返回上个月的最后1天  
           --chr(39) 这个是加引号  
            to_char(last_day(add_months(v_rq, -1)) + 1 - 1 / 24 / 60 / 60,  
                    'yyyymmdd')  
           when '中旬' then  
            to_char(v_rq, 'yyyymm') || '10' else   
            to_char(v_rq, 'yyyymm') || '20'  
         end  
    into refstr  
    from dual;  
  return refstr;  
end fd_lastxunend;  
  
-- 这个获取的是:上旬的结束日期  
select fd_lastxunend(sysdate) from dual;    
select fd_lastxunend(to_date('20130305','yyyymmdd')) from dual;  
select fd_lastxunend(to_date('20130311','yyyymmdd')) from dual;  
select fd_lastxunend(to_date('20130315','yyyymmdd')) from dual;  
select fd_lastxunend(to_date('20130221','yyyymmdd')) from dual;  
  
--执行结果:20130831、20130228、20130310、20130310、20130220  
  
-- 观察   1 / 24 / 60 / 60    的作用 这个是一秒  
select last_day(add_months(trunc(sysdate), -1)) + 1 - 1 / 24 / 60 / 60  
  from dual;  
select last_day(add_months(trunc(sysdate), -1)) from dual;  
select last_day(add_months(trunc(sysdate), -1)) + 1 from dual;  
-- 执行结果:2013/8/31 23:59:59、2013/8/31、2013/9/1  

 


CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,