Oracle獲取日期的週數

2022-09-22 19:18:12 字數 3115 閱讀 1338

本篇是針對以上一篇中 「獲取日期的星期」 部分的展開。

計算標準

oracle 裡支援兩種標準的時間, 一種是oracle 自身的標準, 另一種是iso 的標準

1. oralce 標準

1) 每年的 1 月1號作為這一年的第一天。(不管這一天是星期幾)

比如: 2013/01/01 是星期二, 這一天作為2023年的第一天。

2) 週數計算公式 week = int(dayofyear+6)/7 ; dayofyear 是這一天是這一年的第幾天

3) 週數區間: 1-53

2. iso標準

1)每個星期總是從周一開始,週日結束

2)如果1月1日是周

五、週六或週日,則這一周算為上一年的最後一周,因為這週的大部分時間屬於上一年

3)如果1月1日是周

一、周二、週三或周四,則這一周算為新年的第一周,因為這週的大部分時間屬於新的一年

4)時間區間: 1-52 or 1-53

舉例來說: 對於1998和2023年的1月1日,2023年是算第一周,而2023年的1月1日卻算為上一年的最後一周。

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

motu

weth

frsa

suiso week

- -- 1

2 34 1 iso week of 1998

5 67 8

9 10

11 2 iso week of 1998

12 13

14 15

16 17

18 3 iso week of 1998

19 20

21 22

23 24

25 4 iso week of 1998

26 27

28 29

30 31

- 5 iso week of 1998

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

motu

weth

frsa

suiso week

- -- -

1 23 53 iso week of 1998

4 56 7

8 910 1 iso week of 1999

11 12

13 14

15 16

17 2 iso week of 1999

18 19

20 21

22 23

24 3 iso week of 1999

25 26

27 28

29 30

31 4 iso week of 1999

oracle中獲取年份

1. oralce 標準 - yyyy

oralce 標準獲取年份的方式很簡單:

select to_char(to_date('1997/01/01','yyyy/mm/dd'), 'yyyy') from dual;

select to_char(to_date('1997/12/31','yyyy/mm/dd'), 'yyyy') from dual;都是返回 1997

2. iso 標準 - iyyy

select to_char(to_date('1997/01/01','yyyy/mm/dd'), 'iyyy') from dual;

select to_char(to_date('1997/12/31','yyyy/mm/dd'), 'iyyy') from dual;返回: 1997, 1998

是不是很奇怪, 1997/12/31 號的年份是 1998 .

其實原因很簡單, 根據上面的標準, 2023年1月1日是周四,則這一周算為新年的第一周,因為這週的大部分時間屬於1998. 所以1997/12/31 也屬於1998 年的第一周, 所以得到的是 1998.

你可能會想:

這是否因因為上面把字串轉為日期的時候使用了yyyy這種格-- to_date('1997/12/31','yyyy/mm/dd'), 如果使用to_date('1997/12/31','iyyy/mm/dd'), 'iyyy') 是否可以? 不幸的是, oracle 不支援這種用法。

假設當天是 1997/12/31 , 使用 to_char(sysdate,'iyyy') , 發現同樣獲得的是 1998.

總結一下: 如果從string 轉換為日期, 如果只取這個日期的年份的話, 最好使用 yyyy。

oracle 獲取週數

要獲取某一天是這一年的第幾周, 同樣有兩種標準的區別:

1. oracle 標準 - ww

這種標準和演算法看起來很傻瓜。 int(dayofyear+6)/7

select to_char(to_date('1997/01/01','yyyy/mm/dd'), 'yyww') from dual;

select to_char(to_date('1997/01/08','yyyy/mm/dd'), 'yyww') from dual;

select to_char(to_date('1997/12/31','yyyy/mm/dd'), 'yyww') from dual;不過這種標準在一般的公司使用的應該會比較少。

2. iso 標準 - iw

select to_char(to_date('1997/01/01','yyyy/mm/dd'), 'iyiw') from dual;

select to_char(to_date('1997/12/31','yyyy/mm/dd'), 'iyiw') from dual;返回: 9701,9801

如上所述, 1997/12/31 歸到 1998 年的第一周。

需要特別提醒的是:(本篇的精華)

年份 和 週數要使用同樣的標準, 不要混著使用,

比如 : yyiw -- oracle 的年份, iso的週數

iyww

否則的話, 會得到一些錯誤的結果。

select to_char(to_date('1997/12/31','yyyy/mm/dd'), 'yyiw') from dual;整整少了一年。

C 獲取當前日期當年的週數

這幾天跨年,專案上遇到了乙個週數計算的問題。2016年的元旦是周五開始的,之前系統計算的是屬於15年的第53個周,但是年份已經到了16年了。公司要求從1月1號周五開始算作16年的第乙個周,今天1月4號也就是周一,開始算作16年的第二個周。網上的解決方案是這樣子的。一.找到第一周的最後一天 先獲取1月...

C 根據日期計算日期週數

當我們知道乙個日期後,有的時候想知道當前日期是當年的第幾周 如我們做週報計畫什麼的就可能遇到 一周的第一天是週幾有兩種說法,有的是以周一圍一周的第一天,有的是以週日為一周的第一天,下面根據兩種情況分別來計算 一 以週日為一周的第一天 根據日期計算日期週數 以週日為一周的第一天 日期 日期週數 pri...

js獲取指定日期週數以及星期幾

js獲取日期時遇到如下需求,根據某年某周獲取一周的日期。如開始日期規定為星期四到下一周的星期五為一周。如下 function getnowformatdate thedate else if day 10 else return currentdate function isinoneyear ye...