Oracle周计算问题

时间:2010-02-17 19:15:48

标签: sql oracle date

我正在使用Oracle的to_char()函数将日期转换为周数(1-53):

select  pat_id, 
    pat_enc_csn_id, 
    contact_date, 
    to_char(contact_date,'ww') week,
    ...
'ww'开关给出了今年1月份日期的这些值:

Date        Week
1-Jan-10    1
2-Jan-10    1
3-Jan-10    1
4-Jan-10    1
5-Jan-10    1
6-Jan-10    1
7-Jan-10    1
8-Jan-10    2
9-Jan-10    2
10-Jan-10   2
11-Jan-10   2
12-Jan-10   2

快速查看日历表明这些值应为:

Date         Week
1-Jan-10    1
2-Jan-10    1
3-Jan-10    2
4-Jan-10    2
5-Jan-10    2
6-Jan-10    2
7-Jan-10    2
8-Jan-10    2
9-Jan-10    2
10-Jan-10    3
11-Jan-10    3
12-Jan-10    3

如果我使用'iw'开关而不是'ww',结果就不太可取了:

Date         Week
1-Jan-10    53
2-Jan-10    53
3-Jan-10    53
4-Jan-10    1
5-Jan-10    1
6-Jan-10    1
7-Jan-10    1
8-Jan-10    1
9-Jan-10    1
10-Jan-10   1
11-Jan-10   2
12-Jan-10   2

是否有另一个Oracle函数可以按照我的预期计算周数,或者我需要编写自己的函数吗?

修改

我正在尝试匹配Crystal Reports使用的逻辑。每个星期从星期日开始;一年中的第一周从1月1日开始的任何一天开始(例如在2010年,1月1日是星期五)。

4 个答案:

答案 0 :(得分:1)

使用IW时,Oracle遵循ISO 8601标准关于周数(参见http://en.wikipedia.org/wiki/ISO_8601)。这与我们在欧洲通常使用的标准相同。

Oracle论坛上也提到了您的问题:http://forums.oracle.com/forums/thread.jspa?threadID=947291http://forums.oracle.com/forums/message.jspa?messageID=3318715#3318715。也许你可以在那里找到解决方案。

答案 1 :(得分:0)

由于您似乎正在使用您的自己对周数的特殊定义,因此您需要编写自己的函数。

NLS_TERRITORY影响D格式模型使用的一周开始的日期可能会有所帮助

另见:

http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements004.htm#SQLRF00210

http://www.adp-gmbh.ch/ora/sql/to_char.html

答案 2 :(得分:0)

基于这个问题How do I calculate the week number given a date?,我编写了以下Oracle逻辑:

CASE
  --if [date field]'s day-of-week (e.g. Monday) is earlier than 1/1/YYYY's day-of-week
  WHEN to_char(to_date('01/01/' || to_char([date field],'YYYY'),'mm/dd/yyyy'), 'D') - to_char([date field], 'D') > 1 THEN
    --adjust the week
    trunc(to_char([date field], 'DDD') / 7) + 1 + 1 --'+ 1 + 1' used for clarity
  ELSE trunc(to_char([date field], 'DDD') / 7) + 1
END calendar_week

答案 3 :(得分:0)

我知道这是旧的,但仍然是一个常见的问题。

这应该以最小的努力给你正确的结果:

select  pat_id, 
pat_enc_csn_id, 
contact_date, 
to_char(contact_date + 1,'IW') week,
...