详细讲解Oracle数据库的“周数计算”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详细讲解Oracle数据库的“周数计算”相关的知识,希望对你有一定的参考价值。

参考技术A

  ——日期计算 算第n周的第一天及最后一天是几号 by keynes

  ================================================

  —— ww的算法为每年 月 日为第一周开始 date+ 为每一周结尾

  —— 例如 为第一周的第一天 而第一周的最后一天为 + =

  —— 公式 每周第一天 date + 周 *

  —— 每周最后一天 date + 周 *

  你会发现怎么编排格式都会跑掉

  =========================================================================

  ——日期计算 算第n周的第一天及最后一天是几号 by keynes

  =========================================================================

  —— ww的算法为每年 月 日为第一周开始 date+ 为每一周结尾

  —— 例如 为第一周的第一天 而第一周的最后一天为 + =

  —— 公式 每周第一天 date + 周 *

  —— 每周最后一天 date + 周 *

  —— 如果以ww格式为主 第 周的起迄如下

   asdb WF>select to_date( yyyymmdd ) + * to_date( yyyymmdd ) + * from dual

  TO_DATE( TO_DATE(

  

   JAN JAN

   asdb WF>select to_date( yyyymmdd ) + * to_date( yyyymmdd ) + * from dual

  TO_DATE( TO_DATE(

  

   APR APR

  Elapsed

  —— 验证如下

   asdb WF>select to_char(to_date( yyyymmdd ) ww ) as weekn to_char(to_date( yyyymmdd ) ww ) as week to_char(to_date( yyyymmdd ) ww ) as week to_char(to_date( yyyymmdd ) ww ) as weekn from dual

  WEEK WEEK WEEK WEEK

  

  

  Elapsed

   asdb WF>

  —— iw的算法为星期一至星期日算一周 且每年的第一个星期一为第一周

  —— 例如 为星期六 所以用iw的算法是前年的 周 而 之后才是第一周的开始

  —— 公式 每周第一天 next_day(date) + 周 *

  —— 每周最后一天 next_day(date) + 周 *

  —— 如果以iw格式为主 第 周的起迄如下

   asdb WF>select next_day(to_date( yyyymmdd ) MONDAY )+ * as first_day next_day(to_date( yyyymmdd ) MONDAY )+ * as last_day from dual

  FIRST_DAY LAST_DAY

  

   JAN JAN

  Elapsed

   asdb WF>

   asdb WF>select next_day(to_date( yyyymmdd ) MONDAY )+ * as first_day next_day(to_date( yyyymmdd ) MONDAY )+ * as last_day from dual

  FIRST_DAY LAST_DAY

  

   APR MAY

  Elapsed

   asdb WF>

  —— 验证如下

   asdb WF>select to_char(to_date( yyyymmdd ) iw ) as weekn to_char(to_date( yyyymmdd ) iw ) as week to_char(to_date( yyyymmdd ) iw ) as week to_char(to_date( yyyymmdd ) iw ) as weekn from dual

  WEEK WEEK WEEK WEEK

  

  

  Elapsed

  其它

  ——== 查今天是 本月 的第几周

  SELECT TO_CHAR(SYSDATE WW ) TO_CHAR(TRUNC(SYSDATE MM ) WW ) + AS weekOfMon from dual

  或

  SELECT TO_CHAR(SYSDATE W ) AS weekOfMon from dual

  ——== 查今天是 今年 的第几周

  select to_char(sysdate ww ) from dual

  或

  select to_char(sysdate iw ) from dual

  附注

  上文所提之iw及ww格式在doc内解释如下

  IW = Week of year ( or ) based on the ISO standard

  WW = Week of year ( ) where week starts on the first day of the year and continues to the seventh day of the year

lishixinzhi/Article/program/Oracle/201311/18798

Oracle 集合类型

集合类型  

 

1. 使用条件:

   a. 单行单列的数据,使用标量变量 。 
   b. 单行多列数据,使用记录 [ 详细讲解请见: 点击打开链接 ]
   c. 单列多行数据,使用集合

       *集合:类似于编程语言中数组也就是。pl/sql集合类型包括关联数组Associative array(索引表 pl/sql table)、嵌套表(Nested Table)、变长数组(VARRAY)。

 

2. 三种集合类型区别:

     Nested table与VARRY既可以被用于PL/SQL,也可以被直接用于数据库中,但是Associative array不行,也就是说,Associative array是不能通过CREATE TYPE语句进行单独创建,只能在PL/SQL块(或Package)中进行定义并使用(即适用范围是PL/SQL Block级别),而Nested table与VARRAY则可以使用CREATE TYPE进行创建(即适用范围是Schema级别),它们还可以直接作为数据库表中列的类型。

 

3.  集合的方法:

       exists(index) 索引处的元素是否存在  
       count 当前集合中的元素总个数  
       limit 集合元素索引的最大值  
          索引表和嵌套表是不限个数的,所以返回null,变长数组返回定义时的最大索引  
       first  返回集合第一个元素索引  
       last  返回集合最后一个元素索引  
       prior 当前元素的前一个  
       next 当前元素的后一个  
      
       extend 扩展集合的容量,增加元素 只是用于嵌套表和varry类型  
           x.extend 增加一个null元素  
           x.extend(n) 增加n个null元素  
           x.extend(n,i) 增加n个元素,元素值与第i个元素相同  
       trim 从集合的尾部删除元素 只用于NEST TABLE和VARRY类型  
       trim 从集合尾部删除一个元素  
       trim(n) 从集合尾部删除n个元素  
       delete 按索引删除集合元素  
           delete 删除所有  
           delete(index) 删除第index个  
           delete(a,b) 删除a--b之间的所有元素 

4.  集合类型的声明与初始化:

    1)关联数组:
         a. 下标无限制,可以为负数  
         b. 元素个数无限制  
         c.  定义  
              TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY key_type;  
              type_name:用户自定义数据类型的名字  
              element_type:索引表中元素类型  
              key_type:索引表元素下标的数据类型(BINARY_INTEGER,PLS_INTEGER,VARCHAR2)  

         d. 例1:

             

[sql] view plain copy
  1. declare  
  2.   type index_tab_type is table of varchar2(30) index by BINARY_INTEGER;  
  3.   v_table index_tab_type;  
  4. begin  
  5.   v_table(-1) :=‘hello‘;--设定下标为-1的元素的值  
  6.   v_table(1)  :=‘,‘;  
  7.   dbms_output.put_line(v_table(-1)||‘-‘||v_table(1));  
  8.   dbms_output.put_line(‘元素个数:‘||v_table.count);  
  9.   v_table(5) :=‘world‘;  
  10.   dbms_output.put_line(‘元素个数:‘||v_table.count);  
  11.   dbms_output.put_line(‘第一个元素‘||v_table.first);  
  12.   dbms_output.put_line(‘最后一个元素‘||v_table.last);  
  13. end;  
  14. /  

 

[sql] view plain copy
  1. hello-,  
  2. 元素个数:2  
  3. 元素个数:3  
  4. 第一个元素-1  
  5. 最后一个元素5  
  6.   
  7. PL/SQL 过程已成功完成。  

         e.例2:使用varchar2作为索引元素类型 ,其实也就和java中的map一样了 key-value(键值对)形式存储

 

 

[sql] view plain copy
  1. declare  
  2.   type index_tab_type is table of varchar2(30) index by varchar2(30);  
  3.   v_table index_tab_type;  
  4.   v_record emp%rowtype;  
  5. begin  
  6.   --emp表中查询3条记录,以name-job的形式存储到索引表中  
  7.   select * into v_record from emp where emp.empno=7788;  
  8.   v_table(v_record.ename):= v_record.job;  
  9.   select * into v_record from emp where emp.empno=7844;  
  10.   v_table(v_record.ename):= v_record.job;  
  11.   select * into v_record from emp where emp.empno=7900;  
  12.   v_table(v_record.ename):= v_record.job;  
  13.   dbms_output.put_line(v_table.count);--3  
  14.   dbms_output.put_line(v_table(v_record.ename));--CLERK  
  15. end;  
  16. /  

 

 

[sql] view plain copy
  1. 3  
  2. CLERK  
  3.   
  4. PL/SQL 过程已成功完成。  



     2)嵌套表 Nested Table
         a. 下标从1开始,元素个数灭有限制(*使用时必须先初始化,用extend属性可以扩展元素个数)  
         b.  可以作为表定义数据类型,但是前提是要先create 创造嵌套表类型,这就可以实现1对多了定义  
                TYPE type_name IS TABLE OF element_type;  
         c.  和索引表的区别也就是看看有无index by语句,嵌套表的索引固定是int型的 . 

 

         d.例1:

 

[sql] view plain copy
  1. declare  
  2.      type nest_table_type is table of emp.ename%type;  
  3.      v_nest_tab nest_table_type;  
  4. begin  
  5.      v_nest_tab :=nest_table_type(‘x‘);--初始化 必须! 语句 type_name(...)  
  6.      select ename into v_nest_tab(1) from emp where empno=7788;  
  7.      dbms_output.put_line(v_nest_tab(1));  
  8. end;  


[sql] view plain copy
  1. SCOTT  
  2.   
  3. PL/SQL 过程已成功完成。  


          e.例2:在表列中使用嵌套表 嵌套表类型的列是单独一个表存储,先创建一个这样的类型才能使用

 

 

[sql] view plain copy
  1.  create type nest_tab_type is table of varchar2(30);     
  2.   create table test_nest_tab(    
  3.      id int,    
  4.      vals nest_tab_type --使用    
  5.   ) nested table vals store as nest_tab;--vals字段用嵌套表存储,表明nest_tab    
  6.   --上面语句执行完之后,在生成TEST_NEST_TAB的同时会生出一个关联表NEST_TAB用来存储关联表的数据    
  7. --插入数据    
  8. insert into test_nest_tab values(1,nest_tab_type(‘one‘,‘two‘,‘three‘,‘four‘));    
  9. --查询数据    
  10. declare     
  11.   v_id int;    
  12.   v_tab nest_tab_type;    
  13. begin    
  14.   select * into v_id,v_tab from test_nest_tab where id=1;    
  15.   dbms_output.put_line(v_id);    
  16.   for i in 1..v_tab.count loop    
  17.   dbms_output.put_line(v_tab(i));    
  18.   end loop;    
  19. end;    


[sql] view plain copy
  1. 1  
  2. one  
  3. two  
  4. three  
  5. four  
  6.   
  7. PL/SQL 过程已成功完成。  


      3)Varry 可变数组 

 

        a. 定义  
             TYPE type_name IS VARRAY(size_limit) OF element_type[NOT NULL];  
        b.  这个就和java中的数组差不多了,下标from 1 ,定义时先指定最大元素个数,也和varchar2(size)这种一样。  
        c.  使用时也必须先用构造方法初始化 ,可以作为表列类型  
        d.  例1:
        

[sql] view plain copy
  1. declare  
  2.   type varr is VARRAY(10) of int;  
  3.   v_varr varr :=varr();  
  4. begin  
  5.   --dbms_output.put_line(varr.count);  
  6.   for i in 1..5 loop  
  7.       v_varr.extend;  
  8.       v_varr(i) :=i*i;  
  9.   end loop;  
  10.   
  11.   for i in 1..5 loop  
  12.       dbms_output.put_line(v_varr(i));  
  13.   end loop;  
  14. end;  
  15. /  


[sql] view plain copy
  1. 1  
  2. 4  
  3. 9  
  4. 16  
  5. 25  
  6.   
  7. PL/SQL 过程已成功完成。  


            e.例2:可变数组作为表列类型 可变数组是存储在表内部的,不同于嵌套表

 

 

[sql] view plain copy
  1. create type varr_type is varray(10) of varchar2(30);--先创建类型    
  2. create table test_varray(    
  3.     id int,    
  4.     name varchar2(30),    
  5.     params varr_type --param是使用可变数组类型    
  6. );    
  7. --插入数据    
  8. insert into test_varray values(1,‘bird‘,varr_type(‘a‘,‘b‘,‘c‘));    
  9. --查询数据    
  10. declare     
  11.     v_varr varr_type;    
  12.     v_name test_varray.name%type;    
  13. begin    
  14.     select name,params into v_name,v_varr from test_varray where id=1;    
  15.     for i in 1..v_varr.count loop    
  16.     dbms_output.put_line(v_varr(i));    
  17.     end loop;    
  18. end;   


 

 

[sql] view plain copy
  1. a  
  2. b  
  3. c  
  4.   
  5. PL/SQL 过程已成功完成。  



 

5. 如何选择适用的集合类型:

 

       通常来说,对集合类型的第一选择应该是Associative array,因为它不需要初始化或者EXTEND操作,并且是迄今为止最高效的集合类型。唯一不足的一点是它只能用于PL/SQL而不能直接用于数据库。

  如果你需要允许使用负数索引,应该选择Associative array;

  如果你需要使用10g,11g中的那些集合操作,应该选择Nested table;

  如果你需要限制集合元素的个数,应该选择VARRAY。

 























































以上是关于详细讲解Oracle数据库的“周数计算”的主要内容,如果未能解决你的问题,请参考以下文章

详细讲解在CentOS 7上安装oracle 12c(内含软件包)

Linux服务器搭建Oracle 12c数据库 详细安装教程

Linux oracle安装 内核参数讲解

Oracle游标解析

suse 11 怎么安装nginx 求详细步骤

Oracle 集合类型