設(shè)為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

返回列表 發(fā)新帖
查看: 2584|回復(fù): 0
打印 上一主題 下一主題

[ADO/DAO] 在Oracle中如何獲取日期的周數(shù)

[復(fù)制鏈接]

點(diǎn)擊這里給我發(fā)消息

跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2015-11-4 14:47:27 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
在Oracle中如何獲取日期的周數(shù)
前言
本篇是針對以上一篇中  “獲取日期的星期” 部分的展開。


計(jì)算標(biāo)準(zhǔn)
oracle 里支持兩種標(biāo)準(zhǔn)的時(shí)間, 一種是oracle 自身的標(biāo)準(zhǔn), 另一種是ISO 的標(biāo)準(zhǔn)
1.  oralce 標(biāo)準(zhǔn)

  1) 每年的 1 月1號作為這一年的第一天。(不管這一天是星期幾)
           比如:  2013/01/01 是星期二, 這一天作為2013年的第一天。
  2) 周數(shù)計(jì)算公式  week = int(dayOfYear+6)/7   ; dayOfYear 是這一天是這一年的第幾天
  3) 周數(shù)區(qū)間:  1-53
2. ISO標(biāo)準(zhǔn)
  1)每個(gè)星期總是從周一開始,周日結(jié)束
  2)如果1月1日是周五、周六或周日,則這一周算為上一年的最后一周,因?yàn)檫@周的大部分時(shí)間屬于上一年
  3)如果1月1日是周一、周二、周三或周四,則這一周算為新年的第一周,因?yàn)檫@周的大部分時(shí)間屬于新的一年
  4)時(shí)間區(qū)間: 1-52 or 1-53
舉例來說:  對于1998和1999年的1月1日,1998年是算第一周,而1999年的1月1日卻算為上一年的最后一周。

Table 3-7 First ISO Week of the Year: Example 1, January 1998
[td]
Mo
Tu
We
Th
Fr
Sa
Su
ISO Week
-
-
-
1
2
3
4
1 ISO week of 1998
5
6
7
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
[td]
Mo
Tu
We
Th
Fr
Sa
Su
ISO Week
-
-
-
-
1
2
3
53  ISO week of 1998
4
5
6
7
8
9
10
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 標(biāo)準(zhǔn)  - YYYY
oralce 標(biāo)準(zhǔn)獲取年份的方式很簡單:

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 標(biāo)準(zhǔn) - 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 .
其實(shí)原因很簡單, 根據(jù)上面的標(biāo)準(zhǔn), 1998年1月1日是周四,則這一周算為新年的第一周,因?yàn)檫@周的大部分時(shí)間屬于1998. 所以1997/12/31 也屬于1998 年的第一周, 所以得到的是 1998.
你可能會想:
這是否因因?yàn)樯厦姘炎执D(zhuǎn)為日期的時(shí)候使用了YYYY這種格-- TO_DATE('1997/12/31','YYYY/MM/DD'), 如果使用TO_DATE('1997/12/31','IYYY/MM/DD'), 'IYYY') 是否可以? 不幸的是, oracle 不支持這種用法。
假設(shè)當(dāng)天是  1997/12/31 , 使用 TO_CHAR(sysdate,'IYYY') , 發(fā)現(xiàn)同樣獲得的是 1998.

總結(jié)一下: 如果從string 轉(zhuǎn)換為日期, 如果只取這個(gè)日期的年份的話, 最好使用 YYYY。

Oracle 獲取周數(shù)
要獲取某一天是這一年的第幾周, 同樣有兩種標(biāo)準(zhǔn)的區(qū)別:
1.  oracle 標(biāo)準(zhǔn)  - WW
這種標(biāo)準(zhǔn)和算法看起來很傻瓜。  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;
很簡單; 返回  9701 ,9702,9753

不過這種標(biāo)準(zhǔn)在一般的公司使用的應(yīng)該會比較少。

2. iso 標(biāo)準(zhǔn) - 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 年的第一周。

需要特別提醒的是:(本篇的精華)
年份 和 周數(shù)要使用同樣的標(biāo)準(zhǔn), 不要混著使用,
比如 :  YYIW  -- oracle 的年份, ISO的周數(shù)
            IYWW
否則的話, 會得到一些錯(cuò)誤的結(jié)果。

select TO_CHAR(TO_DATE('1997/12/31','YYYY/MM/DD'), 'YYIW') from dual;
返回:9701
整整少了一年。
而且這種錯(cuò)誤在不跨年的狀況上你可能還不會發(fā)現(xiàn), 一跨年, 發(fā)現(xiàn)又回到了一年前 ^^


摘自:oscar999的專欄

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 分享淘帖 訂閱訂閱
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機(jī)版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2024-10-23 08:40 , Processed in 0.105116 second(s), 28 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表