求写一个oracle函数,关于周期

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求写一个oracle函数,关于周期相关的知识,希望对你有一定的参考价值。

输入参数是一个日期
返回参数当前年,当前周期,周期开始日期,周期结束日期
(周期的计算方式是每年的第一天到第一个周日为第一周,
之后的7天为一周[即:周一到周日为一周],
每年的最后一个周一到最后一天为最后一周),总共只有12分了。。。没办法多给

参考技术A create or replace function get_week_start_end(v_date in date) return varchar2 is
v_datev_week varchar2(512);
begin
select '你录入的时间为'||v_date||'。'||
'本周的第一天时间为:'||
to_char((trunc(v_date,'yyyy')+to_number(to_char(v_date,'ww'))*7-7),'yyyy-mm-dd')
||'本周期的最后一天为:'||
to_char((trunc(v_date,'yyyy')+to_number(to_char(v_date,'ww'))*7-1),'yyyy-mm-dd')
into v_datev_week from dual;
return(v_datev_week);
end get_week_start_end;
/
--以上是方法
必须传入日期哦(也可以更改一下直接传入字符),测试查询语句
select get_week_start_end(to_date('2014-10-10','yyyy-mm-dd')) from dual;
参考技术B 必须要写函数么,一般我们写的函数都是一个函数一个结果,很少有一个函数几个结果的,虽然oracle
似乎用out可是实现,但是从来没这么写过,写完了可能需要很多测试才行。而且一个语句可以搞定的为啥非要写函数呢,用next_day,和trunc,以及to_date等,可以组合出来的。只要你的输入格式固定,应该问题不大。追问

那如果改成语句怎么写?

追答

你的字段是字符的,或者是时间格式的,如果是时间格式的,那么在截取年的时候要转换下,如果是字符的,那么首先要看你的日期是什么形式的,然后转换为时间格式的,进行计算。
这里我假设是时间格式的,我用sysdate来做了,格式为yyyy-mm-dd HH24::mi:ss
那么我们写为
select to_char(sysdate,'yyyy') 当前年,trunc((trunc(sysdate+7,'day')-trunc(sysdate,'year')+1)/7)+1 当期周期,(case when to_char(trunc(sysdate,'iw'),'yyyy')=to_char(sysdate,'yyyy') then trunc(sysdate,'iw') else trunc(sysdate,'year') end) 周期开始日期,(case when to_char(trunc(sysdate+7,'day'),yyyy)=to_char(sysdate,'yyyy') then trunc(sysdate+7,'day') else trunc(last_day(sysdate),'dd') end) 周期结束日期 from dual
有些地方可能要调整,不过大概的意思是这样的。

以上是关于求写一个oracle函数,关于周期的主要内容,如果未能解决你的问题,请参考以下文章

关于Oracle的decode函数

Oracle-分析函数_总结

关于退货声明的 Oracle 文档

关于ORACLE中的DECODE函数的一个应用

关于oracle中table函数的使用

java调用oracle存储过程 关于sql里面in函数参数的问题