date的to char取自然周及format引數

2021-08-24 23:58:29 字數 3382 閱讀 5385

很多時間我們需要用oracle提供的to_char()函式來取得某個日期是屬於今年的第幾周.例如:to_char(to_date('20090112','yyyymmdd'), 'ww') ,得到的結果是02,就是第2?可看看日曆上,2023年1月12日第三週的周一.為什麼會有這樣的問題呢?

由於oracle在to_char()函式計算一年中的第幾周是從該年的1月1日開始,7天為1周來計算的,所以2023年的1月12日,就是第2周.

為了得到自然周,我們需要為該日期加上該年的1月1日所在周被忽略掉的那些天數,然後再用to_char( )

函式,就可以取得自然周了。

但當1月1日為週日時,用to_date('', 'd')計算出它是該周的第1天,實際上這1天已是本年的第一周了,所以需要用乙個decode將其置為第8天,然後再計算被忽略掉的天數,才能得到正確的結果。

所以,可以採用下面的sql語句,仍然以2023年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;

另外附上用於日期和時間的format:

format

描述hh

一天的小時數 (01-12)

hh12

一天的小時數 (01-12)

hh24

一天的小時數 (00-23)mi

分鐘 (00-59)ss

秒 (00-59)ms

毫秒 (000-999)us

微秒 (000000-999999)

ssss

午夜後的秒 (0-86399)

am或a.m.或pm

或p.m.

正午標識(大寫)

am或a.m.或pm

或p.m.

正午標識(小寫)

y,yyy

帶逗號的年(4 和更多位)

yyyy

年(4和更多位)

yyy

年的後三位yy

年的後兩位y

年的最後一位

iyyy

iso 年(4位或更多位)

iyyiso 年的最後 3 位 iy

iso 年的最後 2 位 i

iso 年的最後一位

bc或b.c.或ad

或a.d.

紀元標識(大寫)

bc或b.c.或ad

或a.d.

紀元標識(小寫)

month

全長大寫月份名(空白填充為9字元)

month

全長混合大小寫月份名(空白填充為9字元)

month

全長小寫月份名(空白填充為9字元)

mon

大寫縮寫月份名(3字元)

mon

縮寫混合大小寫月份名(3字元)

mon

小寫縮寫月份名(3字元)mm

月份號(01-12)

day

全長大寫日期名(空白填充為9字元)

day

全長混合大小寫日期名(空白填充為9字元)

day

全長小寫日期名(空白填充為9字元)dy

縮寫大寫日期名(3字元)dy

縮寫混合大小寫日期名(3字元)dy

縮寫小寫日期名(3字元)

ddd

一年裡的日子(001-366)dd

乙個月裡的日子(01-31)d

一周裡的日子(1-7;週日是1)w

乙個月裡的週數(1-5)(第一周從該月第一天開始)ww

一年裡的週數(1-53)(第一周從該年的第一天開始)iw

iso 一年裡的週數(第乙個星期四在第一周裡) cc

世紀(2 位)j

儒略日(自西元前2023年1月1日來的天數)q

季度rm

羅馬數字的月份(i-xii;i=jan)(大寫)rm

羅馬數字的月份(i-xii;i=jan)(小寫)tz

時區名 (大寫)tz

時區名 (小寫)

date的to char取自然周及format引數

很多時間我們需要用oracle提供的to char 函式來取得某個日期是屬於今年的第幾周.例如 to char to date 20090112 yyyymmdd ww 得到的結果是02,就是第2?可看看日曆上,2009年1月12日第三週的周一.為什麼會有這樣的問題呢?由於oracle在to cha...

php獲取自然周 自然月的處理

取得當前時間的上一周時間用date y m d strtotime 1 week 沒有問題,因為每週時間固定為7天。如果當前日期為2016 5 31,用date y m d strtotime 1 month 會產生錯誤。因為這裡把 1 month按照 30 days來算 date y m d st...

sql 取自然年的方法

select nvl sum order ticket num 0 from crs order c left join crs order contact cc on c.id order cc.id order where cc.openid and c.tm update to date to...