有幾周,把每個月的最后一天拼成串傳到如下SQL:
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都做網站、網站制作、企業(yè)官網、英文網站、手機端網站、網站推廣等服務,滿足客戶于互聯(lián)網時代的萬柏林網站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網解決方案。努力成為您成熟可靠的網絡建設合作伙伴!
select to_char(to_date('20111031','yyyymmdd'),'w') from dual;
每周日期段沒找到直接的,可以自己寫個函數:
1、獲取1號是周幾,如周4;
2、則1-4號為第一周,即1號+(7-4)天=4號;
3、循環(huán):4+1=5號——4+7=11號為第二周;
直到:某周加完后的日期,大于該月的最大天數,則取該月最大天數收尾,循環(huán)結束;
第二種方法是你建個存日期的表:
date week
……
20110101
20110102
……
里面存N年的日期,然后根據
select to_char(to_date('20111031','yyyymmdd'),'w') from dual; 把week字段update進去;
然后直接根據這張表寫SQL就直接獲取幾周,每周是幾號到幾號了。。。
to_char(日期,'D')
比如:
select to_char(sysdate,'D') from dual;
其中周日是1,周一是2 。。。 以此類推
這個算法的結果依賴于當前系統(tǒng)時間是什么時候…假設按照你說的,當前系統(tǒng)時間是星期六,那么它計算的結果就是說這個星期六是本月的第幾個星期六。就拿12月來說,12月1日是星期六哦,所以你在12月1號查的時候它結果會是1哦,但是12月2日的時候,你查周日,它的結果仍然是1哦,因為是本月第一次出現的星期日哦!只有當你查12月8日的時候,才開始出現結果2哦…其實你可以在系統(tǒng)里選一些特殊的時間查一下就可以發(fā)現規(guī)律
oracle周數計算
===========================================================
作者: keyneslin()
發(fā)表于: :
分類: ORACLE
出處:
================================================
日期計算 算第n周的第一天及最后一天是幾號 ? by keynes
================================================
ww的算法為每年 月 日為第一周開始 date+ 為每一周結尾
例如 為第一周的第一天 而第一周的最后一天為 + =
公式 每周第一天? date + 周 *
每周最后一天 date + 周 *
不管怎么編排格式都會跑掉 真氣人 ~~
=========================================================================
日期計算 算第n周的第一天及最后一天是幾號 ? by keynes
=========================================================================
ww的算法為每年 月 日為第一周開始 date+ 為每一周結尾
例如 為第一周的第一天 而第一周的最后一天為 + =
公式 每周第一天? date + 周 *
每周最后一天 date + 周 *
如果以ww格式為主 第 周的起迄如下
:asdb:WFselect to_date( yyyymmdd ) + * to_date( yyyymmdd ) + * from dual;
TO_DATE( TO_DATE(
JAN JAN
:asdb:WFselect to_date( yyyymmdd ) + * to_date( yyyymmdd ) + * from dual;
TO_DATE( TO_DATE(
APR APR
Elapsed: : :
驗證如下
:asdb:WFselect 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:WFselect 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:WFselect 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:WFselect 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
參考文件
Format Models
oracle周數計算(續(xù))
===========================================================
作者: keyneslin()
發(fā)表于: :
分類: ORACLE
出處:
本篇是接續(xù)前一篇 因有朋友(allenc)要計算oracle的周數日期起迄
所以測試了一下
測試結果如下
特殊周數計算
星期日到星期六為一周(與ww及iw算法不同)
例 年的第一周起迄是同一天 是
例 年的第一周起為 迄為
計算第一周的天數
create or replace function fdf(p_date in date) return number
is
begin
檢查是否傳入要計算那一年的一月一日
if to_char(to_char(p_date ddd )) then
return null;
end if;
如果第一周的第一天剛好也是最后一天時 傳回
if to_char(p_date d ) then
return (next_day(p_date SATURDAY ) p_date + );
else
return ;
end if;
exception
when others then
dbms_output put_line(sqlerrm);
end;
計算公式
起??????????? decode(周 計算當年的一月一日 計算當年的一月一日 + (fdf(計算當年的一月一日) + (周 )* )) as 起
迄(第一種算法) decode(周 to_date(to_char(計算當年的一月一日 yyyy )|| || yyyymmdd ) 計算當年的一月一日 + (fdf(計算當年的一月一日) + (周 )* )) as 迄
迄(第二種算法) decode(周 last_day(trunc(計算當年的一月一日 mm )+ ) 計算當年的一月一日 + (fdf(計算當年的一月一日) + (周 )* )) as 迄
上面的參數部份 計算當年的一月一日 為date type 周 為number type
傳回值一律是date型態(tài)
例如
年第 周
select decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( to_date(to_char(to_date( yyyymmdd ) yyyy )|| || yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
年第 周
select decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( to_date(to_char(to_date( yyyymmdd ) yyyy )|| || yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
年第 周
select decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( to_date(to_char(to_date( yyyymmdd ) yyyy )|| || yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
年第 周
select decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( to_date(to_char(to_date( yyyymmdd ) yyyy )|| || yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
年第 周
select decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( to_date(to_char(to_date( yyyymmdd ) yyyy )|| || yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
年第 周
select decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( to_date(to_char(to_date( yyyymmdd ) yyyy )|| || yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
年第 周方法
select decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( last_day(trunc(to_date( yyyymmdd ) mm )+ ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
結果如下
:asdb:WF 年第 周
:asdb:WFselect decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( to_date(to_char(to_date( yyyymmdd ) yyyy )|| || yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
S_WEEK??? E_WEEK
JAN JAN
Elapsed: : :
:asdb:WF 年第 周
:asdb:WFselect decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( to_date(to_char(to_date( yyyymmdd ) yyyy )|| || yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
S_WEEK??? E_WEEK
JAN JAN
Elapsed: : :
:asdb:WF 年第 周
:asdb:WFselect decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( to_date(to_char(to_date( yyyymmdd ) yyyy )|| || yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
S_WEEK??? E_WEEK
DEC DEC
Elapsed: : :
:asdb:WF
:asdb:WF 年第 周
:asdb:WFselect decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( to_date(to_char(to_date( yyyymmdd ) yyyy )|| || yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
S_WEEK??? E_WEEK
JAN JAN
Elapsed: : :
:asdb:WF 年第 周
:asdb:WFselect decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( to_date(to_char(to_date( yyyymmdd ) yyyy )|| || yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
S_WEEK??? E_WEEK
JAN JAN
Elapsed: : :
:asdb:WF 年第 周
:asdb:WFselect decode( to_date( yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as s_week decode( to_date(to_char(to_date( yyyymmdd ) yyyy )|| || yyyymmdd ) to_date( yyyymmdd ) + (fdf(to_date( yyyymmdd )) + ( )* )) as e_week from dual;
S_WEEK??? E_WEEK
DEC DEC
Elapsed: : :
lishixinzhi/Article/program/Oracle/201311/18269
PROCEDURE getWeekly( p_date IN DATE, -- 月份所在日期
p_number IN NUMBER, -- 第幾周
p_startDATE OUT DATE , --該周開始日期
p_endDATE OUT DATE ) --該周結束日期
AS
v_lastDay DATE;
v_firstDay DATE;
BEGIN
v_lastDay := LAST_DAY(p_date);
v_firstDay := ADD_MONTHS(v_lastDay, -1) + 1;
p_startDate := ROUND(v_firstDay + 7*(p_number-1)-1, 'DAY');
p_endDate := p_startDate + 6;
END getWeekly;
給分吧,沒啥說的。
select v_date_month,v_date_min,v_date_max,v_count /*該周在本月中的天數*/,
rownum - min(rownum) over(partition by v_date_month) + 1 v_zhou_seq /*本月中的第幾周*/
from (
select to_char(v_date, 'yyyymm') v_date_month,
min(v_date) v_date_min,
max(v_date) v_date_max,
count(1) v_count
from (
--使用開窗函數對2010年全年周進行先后順序的排序
select min(s_rownum) over(partition by rn) rn, a.v_date
from (select rownum s_rownum, to_char(v_date, 'iw') rn, v_date /*, v_date + 7*/ /*, v_zhou*/
from (
--取到2010年全年對應的星期幾
select to_date('2010' || '0101', 'yyyymmdd') + rownum - 1 v_date,
to_char(to_date('2010' || '0101', 'yyyymmdd') + rownum - 1, 'day') v_zhou
from (
--取2010年的天數,并排序
select rownum
from dual
connect by rownum = to_date('2010' || '1231', 'yyyymmdd') -
to_date('2010' || '0101', 'yyyymmdd') + 1
)
)
order by v_date) a
order by v_date
)
group by to_char(v_date, 'yyyymm'), rn
order by rn
);
文章名稱:oracle怎么判斷周幾 oracle判斷日期大于多少時間
文章路徑:http://vcdvsql.cn/article20/hpghco.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供微信小程序、小程序開發(fā)、企業(yè)網站制作、網站制作、App設計、品牌網站制作
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)