Oracle日期周詳解IW

2021-09-07 00:25:24 字數 4716 閱讀 1664

1.1           日期格式化函式

to_char(x [,format])

:將x按format格式轉換成字串。x是乙個日期,format是乙個規定了x採用何種格式轉換的格式字串,format與周相關的有w,ww,iw,d,fmww。

w的含義是乙個月的第幾周。是按照oracle自定義的標準周來返回週數。

iw是iso標準周,它的含義是iso標準週以周別為「主線」,每年最多可以有53個周別,但是每年至少要包含52個周別;如果一年當中第52周別之後至當年的12月31日之間,還有大於或等於4天的話,則定為當年的第53周,否則剩餘這些天數被歸為下一年的第1周;如果在不足52周別的話,則以下一年的時間來補;每週固定的從周一開始作為本週的第1天,到週日作為本週的第7天;比如:在oracle中2023年01月01號依然屬於iw周別2023年的第52周的第7天。這個用到的比較多。

ww是oracle自定義的標準周,它的含義是每年的1月1日作為當年的第一周的第一天(不管當年的1月1日是星期幾);比如:2023年01年01是週三,在oracle中被定義為2023年ww的第一周的第一天。一般很少用到。

d是返回當前日期是這個星期的第幾天。是按照從週日到週六來進行計算的,這是要注意的地方。

fmww該年1月1號(不考慮屬星期幾)開始至該年該乙個星期日為第一周,第二週是從該年第乙個星期開始算(這與iw演算法相同)一年的最後一周以該年的12月31號做為截止。

1.2           日期時間運算函式

next_day(x,y):用於計算x時間後第乙個星期y的時間。y是乙個字串,表示用當前會話語言表示的一周中某一天的全稱(如星期

一、星期二等),也可以是數值。

trunc(x [,format])

:截斷日期,format 中與周相關的有d,iw,ww,w,fmww。

w的含義是乙個月的第幾周。是按照oracle自定義的標準周來返回的是乙個週數。

iw是iso標準周,返回是的當前日期所在周的周一。

ww是oracle自定義的標準周。返回oracle自定義標準周所在的周一。

d

的含義是的返回當前星期的第一天。令人感到奇怪的是根據d返回的是當前星期的第一天是星期日。這點是我們要注意的地方。

fmww該年1月1號(不考慮屬星期幾)開始至該年該乙個星期日為第一周,第二週是從該年第乙個星期開始算(這與iw演算法相同)一年的最後一周以該年的12月31號做為截止。取周的開始時間時在跨年的時候與iw有些區別,比如2023年01年01使用fmww的時候,周的開始時間是2012-01-01,使用iw時,周的開始時間是2011/12/26。

round(x [,format])

:日期的四捨五入format中與周相關的有day。按周一到週三和周四到週日四捨五入到最近的週日。

--

取周的開始時間和結束時間

select trunc(to_date('

2014-07-18

','yyyy-mm-dd

'),'

iw') as startdate from dual;--

本週周一

select trunc(to_date('

2014-07-18

','yyyy-mm-dd

'),'

iw') +

6as enddate from dual;--

本週週日

select trunc(to_date('

2014-07-18

','yyyy-mm-dd

'),'

iw') -

7as startdate from dual;--

-上週周一

select trunc(to_date('

2014-07-18

','yyyy-mm-dd

'),'

iw') -

1as enddate from dual;--

上週週日

取自然周的開始時間和結束時間的難點就需要判斷年初的那幾天是屬於本年的第一周,還是屬於上一年的最後一周,根據iw自然周的定義,少於等於3天是本年的話,屬於上一年的最後一周,大於等於4天屬於本年的話,加上上年的最後幾天,算成本年的第一周。

--

按照周一到週日為一周算週的開始時間和結束時間(iw)自然周

with params as (select trunc(to_date('

2009-01-01

','yyyy-mm-dd

'),'

yyyy

') as sd from

dual)

select

level

周次,decode(

sign(5

-decode(to_char(pm.sd,'

d'),'

1','

7',to_char(pm.sd,'

d'))),-1,

next_day(pm.sd

+(level

-1)*

7,2),next_day(pm.sd+(level

-1)*7-

7,2))

當周第一天,

decode(

sign(5

-decode(to_char(pm.sd,'

d'),'

1','

7',to_char(pm.sd,'

d'))),-1,

next_day(pm.sd

+(level

-1)*

7,2),next_day(pm.sd+(level

-1)*7-

7,2)) +

6當周最後一天

from

dual d

left

join params pm on1=

1connect

bylevel

<=

53--

按照週日到週六為一周算週的開始時間和結束時間(d)

select

level 周次,(trunc(to_date('

2011-01-01

','yyyy-mm-dd

'),'

yyyy

')-7) + (7

-to_char(trunc(to_date('

2011-01-01

','yyyy-mm-dd

'),'

yyyy

'),'

d')+

1)+(level

-1)*

7當周第一天,

(trunc(to_date(

'2011-01-01

','yyyy-mm-dd

'),'

yyyy

')-7) + (7

-to_char(trunc(to_date('

2011-01-01

','yyyy-mm-dd

'),'

yyyy

'),'

d')+

1)+(level

-1)*7+

6當周最後一天

from dual connect by

level

<=

53--

按照oracle標準(ww)

select

level 周次,to_date('

2013-01-01

','yyyy-mm-dd

')+(level

-1)*

7當周第一天,

to_date(

'2013-01-01

','yyyy-mm-dd

')+(level

-1)*7+

decode((to_char(to_date(

'2013-12-31

','yyyy-mm-dd

'),'

ddd')-(level

-1)*

7),1,0,2,1,6

) 當周最後一天

from dual connect by

level

<=

53

--

獲取一年中的最大周次(iw)中國日曆自然周

with params as (select

'2014

'as nf from

dual)

select to_char(to_date(pm.nf ||

'-12-28

','yyyy-mm-dd

'),'

iyyyiw

') from dual left

join params pm on1=

1

上述sql通過卡每年的12月28號屬於哪個周,也判斷一年有多少個自然周。

取周別的時候最好把年份帶上,第一因為周別是相對於哪年的第幾周,第二因為當使用iw的時候對於一年的開始那幾天和結束那幾天可能會產生一樣的週數,就分不清屬於哪年的第一周。

Oracle 關於星期(IW和WW)的演算法

1.檢視資料庫字符集 如果字符集不同,可能顯示亂碼 2.檢視資料庫中指定日期為週幾 create or replace function get weekday pdate date return number is vresult number begin select case to char ...

Oracle日期格式

日期處理完全版 to date格式 day dd number 12 dy abbreviated fri day spelled out friday ddspth spelled out,ordinal twelfth month mm number 03 mon abbreviated mar...

oracle 日期查詢

1.string hql select substr to char create time,yyyy mm dd hh24 mm ss 1,10 count createtime from sitebean where to char createtime,yyyy mm dd to char t...