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

2022-09-15 06:45:09 字數 3386 閱讀 5991

1. 檢視資料庫字符集(如果字符集不同,可能顯示亂碼)

2.  檢視資料庫中指定日期為週幾

create or replace function get_weekday(pdate date) return number is

vresult number;

begin

select case to_char(pdate, 'fmday', 'nls_date_language=english')

when 'monday' then

1when 'tuesday' then

2when 'wednesday' then

3when 'thursday' then

4when 'friday' then

5when 'saturday' then

6when 'sunday' then

7end d

into vresult

from dual;

return vresult;

end;

不推薦(根據nls設定不同結果不同,例如周一為第一天和週日為第一天的weekday結果不同) 

select sysdate today,

to_char(sysdate, 'd') weekday,

trunc(sysdate, 'dd') - to_char(sysdate, 'd') + 1 weekfirstday,

trunc(sysdate, 'dd') - to_char(sysdate, 'd') + 7 weeklastday

from dual;

3. oracle 中關於星期(iw和ww)的演算法oracle中對於星期的計算規則中,其中關於計算本週是一年的第幾周,有兩種格式,iw和ww,其中的區別官方文件解釋如下:

從文件中可以看出,ww的演算法是: int(dayofyear+6)/7,個人覺得這種演算法有點「2」。相信一般情況下,我們不會使用ww的吧,應該iw使用的比較多。

關於oracle提到的這個星期的計算iso標準,是這樣的:

下面這兩張**,是從oracle官方文件中擷取出來的:

table 3-7 first iso week of the year: example 1, january 1998

motu

weth

frsa

suiso week--

-123

4first iso week of 199856

78910

11second iso week of 1998

1213

1415

1617

18third iso week of 1998

1920

2122

2324

25fourth iso week of 1998

2627

2829

3031

-fifth iso week of 1998

table 3-8 first iso week of the year: example 2, january 1999

motu

weth

frsa

suiso week--

--12

3fifty-third iso week of 199845

6789

10first iso week of 1999

1112

1314

1516

17second iso week of 1999

1819

2021

2223

24third iso week of 1999

2526

2728

2930

31fourth iso week of 1999

從表中可以看出,按照iso標準演算法,同樣是1月1日,2023年是算第一周,而2023年的1月1日卻算為上一年的最後一周。

這裡需要注意的是,iso標準中星期的第一天是周一,而oracle中其他一些日期處理演算法中(如d),預設每週的第一天是週日。因為第一天是週日還是周一,由引數nls_territory決定,而該引數的預設值是從nls_lang繼承過來的,nls_lang預設值為america,因此預設週日是每週的第一天)。

我們很多人認為中國人每週第一天從周一開始,其實不是這樣哦,從oracle上可以看出來,其實我國的每週第一天仍然是週日,與美國一致,只有德國、法國等一些歐洲國家是從周一開始的:

sql>

select to_char(sysdate,』yyyymmdd』) from

dual;

to_char(

——–20110901

sql>

alter session set nls_territory=

america;

session altered.

sql>

select to_char(sysdate,』d'

) from dual;t-

5sql> alter session set nls_territory=china;

session altered.

sql> select to_char(sysdate,』d

') from

dual;t-

5sql

>

alter session set nls_territory=

germany;

session altered.

sql>

select to_char(sysdate,』d'

) from dual;t-

4

參考資料

關於ORACLE中取星期的問題

select to char sysdate,day from dual 可以得到當前是一周中的星期幾 select to char sysdate,d from dual 可以得到當前是一周中的第幾天,由於國外人的習慣與中式不同所以通常為 select to char sysdate 1,d fr...

關於oracle中in和exists

今天看sql語句的時候發現了exists這個關鍵字,記得剛用這個關鍵字的時候只知道它和關鍵字in的作用是一樣的,當時覺得無非就是我的條件匹配到子結果集裡面的資料。今天打算把這兩個關鍵字具體怎麼回事區分一下,上網上看了一下,懂了一些兩者的區別,其中還涉及到了效能問題,很吃驚!2018 11 8再次更新...

oracle中關於生成累計和

首先建立oracle基礎表如下 現在要求分別累計各部門的工資之和 select empno,deptno,ename,sal,hiredate,sum sal over order by hiredate as totalsal from emp order by hiredate 效果如圖 當分析...