-- 空值轉換
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" 後繼續。
oracle——SQL複習03
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.