使用TO_Char()函數如何取自然周

很多時間我們需要用 Oracle 提供的 to_char ()函數來取得某個日期是屬於今年的第幾週.例如:TO_CHAR(TO_DATE('20090112','YYYYMMDD'), 'WW') ,得到的結果是02,就是第2?可看看日歷上,2009年1月12日第三週的週一.為什麼會有這樣的問題呢?

由於Oracle在to_char()函數計算一年中的第幾周是從該年的1月1日開始,7天為1周來計算的,所以2009年的1月12日,就是第2周. 為了得到自然周,我們需要為該日期加上該年的1月1日所在周被忽略掉的那些天數,然後再用TO_CHAR( ) 函數,就可以取得自然周了。但當1月1日為週日時,用TO_DATE(' ', 'D')計算出它是該周的第1天,實際上這1天已是本年的第一周了,所以需要用一個DECODE將其置為第8天,然後再計算被忽略掉的天數,才能得到正確的結果。 所以,可以採用下面的SQL語句,仍然以2009年1月12日為例: SELECT TO_CHAR(TO_DATE('20090112', 'YYYYMMDD') +
TO_NUMBER(DECODE(TO_CHAR(TRUNC(TO_DATE('20090112',
'YYYYMMDD'),
'YYYY'),
'D'),
'1',
'8',
TO_CHAR(TRUNC(TO_DATE('20090112', 'YYYYMMDD'),
'YYYY'),
'D'))) - 2,
'WW')
FROM DUAL;
P.S. to_date('','D')是取該日期為一週內的第幾天,從週日開始,周日為1.所以如果1月1日為周日,那麼1月2日就應該是第2周.
上面的
SQL語句,當日期為2009年12月31日,計算出的結果就是01,這是什麼原因呢?

因為我們為日期加上被忽略的天數時,可能造成年末的日期跨年,成為下一年的日期,這樣再用TO_CHAR( )函數,取得的周就成了01。所以我們需要判斷當日期跨年時就置為年末的最後一天,從而取得正確的周。

所以,最終採用下面的SQL語句,就能夠得到正確的自然周了,以2009年12月31日為例:

SELECT TO_CHAR(DECODE(SIGN((TO_DATE('20091231', 'YYYYMMDD') +
TO_NUMBER(DECODE(TO_CHAR(TRUNC(TO_DATE('20091231',
'YYYYMMDD'),
'YYYY'),
'D'),
'1',
'8',
TO_CHAR(TRUNC(TO_DATE('20091231',
'YYYYMMDD'),
'YYYY'),
'D'))) - 2) -
LAST_DAY(TO_DATE('20091231', 'YYYYMMDD'))),
1,
LAST_DAY(TO_DATE('20091231', 'YYYYMMDD')),
(TO_DATE('20091231', 'YYYYMMDD') +
TO_NUMBER(DECODE(TO_CHAR(TRUNC(TO_DATE('20091231',
'YYYYMMDD'),
'YYYY'),
'D'),
'1',
'8',
TO_CHAR(TRUNC(TO_DATE('20091231',
'YYYYMMDD'),
'YYYY'),
'D'))) - 2)),
'WW')
FROM DUAL;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-84641/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/35489/viewspace-84641/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值