oracle——SQL複習03

-- 空值轉換
select nvl(null,0) from dual;

-- 有值指向第一個,無值指向第二個
select nvl2('aaa',1,2) from dual; 
select nvl2(null,1,2) from dual;
 

--獲取這個月末,上個月末的時間
select last_day(trunc(sysdate)) from dual; 
select last_day(add_months(trunc(sysdate),-1))  from dual; 

--獲取當前月的總天數
select last_day(trunc(sysdate)) - last_day(add_months(trunc(sysdate), -1)) days
  from dual;


-- 當前月的工作日
select to_char(sysdate,'D') - 1  from dual; 

--獲取當月的1號
select last_day(add_months(sysdate,-1)) + 1  from dual; 

--獲取上月的1號
select last_day(add_months(sysdate,-2)) + 1  from dual; 


--利用connet by level 函數 獲取 當月的週數
select to_char((last_day(add_months(sysdate, -1)) + 1) + level - 1,
                       'D') - 1 week
          from dual
        connect by level <= 30
        
        
--獲取當前月的工作日
select count(1)
  from (select to_char((last_day(add_months(sysdate, -1)) + 1) + level - 1,
                       'D') - 1 week
          from dual
        connect by level <= (select last_day(trunc(sysdate)) -
                                    last_day(add_months(trunc(sysdate), -1)) days
                               from dual) ) t
 where t.week not in (0, 6) ;


-- 獲取上個月的工作日
select count(1)
  from (select to_char((last_day(add_months(sysdate, -2)) + 1) + level - 1,
                       'D') - 1 week
          from dual
        connect by level <=  (select last_day(add_months(trunc(sysdate), -1)) -
                                    last_day(add_months(trunc(sysdate), -2)) days
                               from dual) ) t
 where t.week not in (0, 6) ;
 
 
----獲取當前月的休息日
select count(1)
  from (select to_char((last_day(add_months(sysdate, -1)) + 1) + level - 1,
                       'D') - 1 week
          from dual
        connect by level <= (select last_day(trunc(sysdate)) -
                                    last_day(add_months(trunc(sysdate), -1)) days
                               from dual)) t
 where t.week in (0, 6);



--創建一個存儲過程
create or replace procedure sql_week
as
  begin 
      select count(1)
        from (select to_char((last_day(add_months(sysdate, -1)) + 1) + level - 1,
                             'D') - 1 week
                from dual
              connect by level <= (select last_day(trunc(sysdate)) -
                                          last_day(add_months(trunc(sysdate), -1)) days
                                     from dual) ) t
       where t.week not in (0, 6)  
   end; 




SELECT to_date('20160315','YYYYMMDD') FROM DUAL ;




declare 
       v_week varchar2(20) ;
begin
  select count(1)
    into v_week
    from (select to_char((last_day(add_months(to_date('20160315','YYYY-MM-DD'), -1)) + 1) + level - 1,
                         'D') - 1 week
            from dual
          connect by level <= (select last_day(trunc(to_date('20160315','YYYY-MM-DD'))) -
                                      last_day(add_months(trunc(to_date('20160315','YYYY-MM-DD')), -1)) days
                                 from dual)) t
   where t.week not in (0, 6); 
   
   dbms_output.put_line( '當月的工作日是是是是:' || v_week);  
end;


                       
                                 
create or replace procedure sql_week_in(current_day in varchar2) as
  v_week int;
begin
  select count(1)
    into v_week
    from (select to_char((last_day(add_months(to_date(current_day, 'YYYY-MM-DD'), -1)) + 1) + level - 1,  'D') - 1 week
            from dual
          connect by level <=
                     (select last_day(trunc(to_date(current_day, 'YYYY-MM-DD'))) - last_day(add_months(trunc(to_date(current_day, 'YYYY-MM-DD')),   -1)) days
                        from dual)) t
   where t.week not in (0, 6);

  dbms_output.put_line('當月的工作日是:' || v_week);

end;


                                 
                                 
--打工存儲過程的測試窗口的代碼如下:                                 
begin
  -- Call the procedure
  --使用oracle的"測試"調試存儲過程輸入參數的時候,因爲current_day 是varchar2類型了,
  --只能輸入20160315,而不是帶引號的'20160315'
  sql_week_in(current_day => :current_day);
end;
 HqkpTKTzAa
 
 
--參考網址: http://zhidao.baidu.com/link?url=ikzPdlScBvDDV2QRy1Bp-IoJ35XHgbJzgJlXgGXdbkiA8V8e722SBcss4UYl4RBXHqDDxxw4bCp-HqkpTKTzAa                         
                                 
                                 
命令窗口執行不了:
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 
Connected as scott@ORCL

SQL> exec sql_week_in '20160315'
begin sql_week_in '20160315'; end;
ORA-06550: 第 1 行, 第 19 列: 
PLS-00103: 出現符號 "20160315"在需要下列之一時:
 := . ( @ % ;
符號 ":=" 被替換爲 "20160315" 後繼續。

SQL> exec sql_week_in 20160315
begin sql_week_in 20160315; end;
ORA-06550: 第 1 行, 第 19 列: 
PLS-00103: 出現符號 "20160315"在需要下列之一時:
 := . ( @ % ;
符號 ":=" 被替換爲 "20160315" 後繼續。              
                                 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章